14

I would like to be able to scroll up/down into a given pane with the same keybinding that xterm does, i.e SHIFT + Page Up/Down.

For example, if the tmux window is divided into 2 vertical panes, I could scroll on one of the two with keyboard while the other one does not scroll.

Is it possible ?

Here's my tmux.conf :

set -g status off
set -g prefix C-o
unbind C-b
bind C-o send-prefix

# settings -------------------------------------------------------------

setw -g utf8 on
setw -g xterm-keys on
set -g default-terminal "screen-256color"

set-option -g set-titles on
set-option -g set-titles-string '[#S:#I #H] #W'

# auto-set window title
setw -g automatic-rename
setw -g aggressive-resize on

# vim keybinds
set-option -g status-keys vi
set-window-option -g mode-keys vi

# scroll inside the current pane
#bind-key k page-up
#bind-key l page-down

# mouse
set -g mode-mouse on
setw -g mouse-select-window on
setw -g mouse-select-pane on

# scrollback buffer n lines
set -g history-limit 100000

# fixes shift-pageup/shift-pagedown
set -g terminal-overrides 'xterm*:smcup@:rmcup@'
set -g visual-activity on

# faster key repetition
set -s escape-time 0

# activity alert
setw -g monitor-activity on
set -g visual-activity on

# alt+directions navigates through panes
bind-key -n M-left select-pane -L
bind-key -n M-right select-pane -R
bind-key -n M-up select-pane -U
bind-key -n M-down select-pane -D
8

To scroll up you can do:

bind -n S-Pageup copy-mode -u

The above doesn't appear to work on a Mac, so I tested with:

bind -n S-Up copy-mode -u

As far as I can tell, after pressing S-Up, you can continue to use S-Up or just page-up to keep scrolling up. You can use page-down to scroll down. These aren't exactly the key-bindings you were looking for, so I apologize. This should get you closer to your goal I hope.

EDIT:

I just tested with:

bind -n Pageup copy-mode -u

and this allows you to use just page-up and page-down.

  • While bind -n Pageup copy-mode -u does allow me to press PgUp to enter copy-mode and scroll up, I can't then use PgUp to keep scrolling up. – apocryphalauthor Jun 23 '16 at 0:44
6

Yes I know this question is old but it's not that far down in the google results and I just spent a lot of time to find out how to do it simply because almost no google result contained an answer, only questions.

AFAIK only one pane scrolls when in copy mode. To go into copy mode you can use prefix-[ and then scroll using C-up and C-down or you can set your own keybindings (in the config file) which in emacs-mode looks like this:

bind-key -t emacs-copy -n S-PPage halfpage-up
bind-key -t emacs-copy -n S-NPage halfpage-down

This will set the key combinations Shift+PageUp and Shift+PageDown to scroll half a page up respectively down when in copy mode. When you're using vi-mode you need to change it to something like this:

bind-key -t vi-copy -n S-PPage halfpage-up
bind-key -t vi-copy -n S-NPage halfpage-down

Now if you want to enter copy mode "automatically" and don't want to use prefix-[ you could add the following line to your config file:

bind-key -t root -n S-PPage copy-mode -u

This would open copy mode and scroll a (full) page up when pressing Shift+PageUp in Edit-Mode (default-mode). To only open copy mode without already scrolling up a page, simply omit the -u. And if you want to scroll a full page up/down or just a line you can use the keywords page-up, scroll-up or use one of the commands

tmux list-keys -t vi-copy
tmux list-keys -t emacs-copy

to see a complete list of options to use and default keybindings.

  • I'm not sure if it's the version of tmux I'm running or not, but the -t parameter is not recognized (however, -T works) Possible typo? – mdip Jan 17 at 15:16
4

Here's a solution that should just work with your muscle memory, allowing you to use Shift+PageUp and Shift+PageDown as you would in the normal terminal.

bind -n Pageup copy-mode -u
bind -n S-Pageup copy-mode -u
bind -n S-Pagedown send-keys Pagedown

If you're using Vim, you'll want to conditionally enable this binding or it'll mess things up when you use PageUp, etc in vim inside of tmux.

is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
    | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
bind -n Pageup if-shell "$is_vim" "send-keys Pageup" "copy-mode -u"
bind -n S-Pageup if-shell "$is_vim" "send-keys Pageup" "copy-mode -u"
bind -n S-Pagedown send-keys Pagedown

(Thanks to @mjwhitta's solution, which this refines)

  • +1 but bind -n Pageup if-shell "$is_vim" "send-keys Pageup" "copy-mode -u; send-keys Pageup" was required to get Pageup to continue scrolling up on multiple presses. – 79E09796 Aug 1 at 9:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.