Add -and-cancel variants for scrolling commands to exit copy mode when

the bottom is reached, from Stephen Hicks.
pull/1161/head
nicm 2017-11-16 11:16:15 +00:00
parent 3b649d2fcd
commit e5ae9dd53d
2 changed files with 35 additions and 12 deletions

12
tmux.1
View File

@ -1122,9 +1122,10 @@ The following commands are supported in copy mode:
.It Li "end-of-line" Ta "$" Ta "C-e"
.It Li "goto-line <line>" Ta ":" Ta "g"
.It Li "halfpage-down" Ta "C-d" Ta "M-Down"
.It Li "halfpage-down-and-cancel" Ta "" Ta ""
.It Li "halfpage-up" Ta "C-u" Ta "M-Up"
.It Li "history-bottom" Ta "G" Ta "M-<"
.It Li "history-top" Ta "g" Ta "M->"
.It Li "history-bottom" Ta "G" Ta "M->"
.It Li "history-top" Ta "g" Ta "M-<"
.It Li "jump-again" Ta ";" Ta ";"
.It Li "jump-backward <to>" Ta "F" Ta "F"
.It Li "jump-forward <to>" Ta "f" Ta "f"
@ -1139,12 +1140,14 @@ The following commands are supported in copy mode:
.It Li "next-word-end" Ta "e" Ta "M-f"
.It Li "other-end" Ta "o" Ta ""
.It Li "page-down" Ta "C-f" Ta "PageDown"
.It Li "page-down-and-cancel" Ta "" Ta ""
.It Li "page-up" Ta "C-b" Ta "PageUp"
.It Li "previous-paragraph" Ta "{" Ta "M-{"
.It Li "previous-space" Ta "B" Ta ""
.It Li "previous-word" Ta "b" Ta "M-b"
.It Li "rectangle-toggle" Ta "v" Ta "R"
.It Li "scroll-down" Ta "C-e" Ta "C-Down"
.It Li "scroll-down-and-cancel" Ta "" Ta ""
.It Li "scroll-up" Ta "C-y" Ta "C-Up"
.It Li "search-again" Ta "n" Ta "n"
.It Li "search-backward <for>" Ta "?" Ta ""
@ -1158,6 +1161,11 @@ The following commands are supported in copy mode:
.It Li "top-line" Ta "H" Ta "M-R"
.El
.Pp
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).
.Pp
The next and previous word keys use space and the
.Ql - ,
.Ql _

View File

@ -30,7 +30,7 @@ static void window_copy_command(struct window_pane *, struct client *,
static struct screen *window_copy_init(struct window_pane *,
struct cmd_find_state *, struct args *);
static void window_copy_free(struct window_pane *);
static int window_copy_pagedown(struct window_pane *, int);
static int window_copy_pagedown(struct window_pane *, int, int);
static void window_copy_next_paragraph(struct window_pane *);
static void window_copy_previous_paragraph(struct window_pane *);
static void window_copy_resize(struct window_pane *, u_int, u_int);
@ -392,7 +392,7 @@ window_copy_pageup(struct window_pane *wp, int half_page)
}
static int
window_copy_pagedown(struct window_pane *wp, int half_page)
window_copy_pagedown(struct window_pane *wp, int half_page, int scroll_exit)
{
struct window_copy_mode_data *data = wp->modedata;
struct screen *s = &data->screen;
@ -431,7 +431,7 @@ window_copy_pagedown(struct window_pane *wp, int half_page)
window_copy_cursor_end_of_line(wp);
}
if (data->scroll_exit && data->oy == 0)
if (scroll_exit && data->oy == 0)
return (1);
window_copy_update_selection(wp, 1);
window_copy_redraw_screen(wp);
@ -524,7 +524,7 @@ window_copy_command(struct window_pane *wp, struct client *c, struct session *s,
struct screen *sn = &data->screen;
const char *command, *argument, *ws;
u_int np = wp->modeprefix;
int cancel = 0, redraw = 0;
int cancel = 0, redraw = 0, scroll_exit;
char prefix;
if (args->argc == 0)
@ -629,9 +629,14 @@ window_copy_command(struct window_pane *wp, struct client *c, struct session *s,
}
if (strcmp(command, "end-of-line") == 0)
window_copy_cursor_end_of_line(wp);
if (strcmp(command, "halfpage-down") == 0) {
if (strcmp(command, "halfpage-down") == 0 ||
strcmp(command, "halfpage-down-and-cancel") == 0) {
if (strcmp(command, "halfpage-down-and-cancel") == 0)
scroll_exit = 1;
else
scroll_exit = data->scroll_exit;
for (; np != 0; np--) {
if (window_copy_pagedown(wp, 1)) {
if (window_copy_pagedown(wp, 1, scroll_exit)) {
cancel = 1;
break;
}
@ -727,9 +732,14 @@ window_copy_command(struct window_pane *wp, struct client *c, struct session *s,
if ((np % 2) != 0)
window_copy_other_end(wp);
}
if (strcmp(command, "page-down") == 0) {
if (strcmp(command, "page-down") == 0 ||
strcmp(command, "page-down-and-cancel") == 0) {
if (strcmp(command, "page-down-and-cancel") == 0)
scroll_exit = 1;
else
scroll_exit = data->scroll_exit;
for (; np != 0; np--) {
if (window_copy_pagedown(wp, 0)) {
if (window_copy_pagedown(wp, 0, scroll_exit)) {
cancel = 1;
break;
}
@ -756,10 +766,15 @@ window_copy_command(struct window_pane *wp, struct client *c, struct session *s,
sn->sel.lineflag = LINE_SEL_NONE;
window_copy_rectangle_toggle(wp);
}
if (strcmp(command, "scroll-down") == 0) {
if (strcmp(command, "scroll-down") == 0 ||
strcmp(command, "scroll-down-and-cancel") == 0) {
if (strcmp(command, "scroll-down-and-cancel") == 0)
scroll_exit = 1;
else
scroll_exit = data->scroll_exit;
for (; np != 0; np--)
window_copy_cursor_down(wp, 1);
if (data->scroll_exit && data->oy == 0)
if (scroll_exit && data->oy == 0)
cancel = 1;
}
if (strcmp(command, "scroll-up") == 0) {