tmux - 使用 shift + page up/down 向上/向下滚动到窗格中

tmux - 使用 shift + page up/down 向上/向下滚动到窗格中

我希望能够使用与 xterm 相同的键绑定(即 SHIFT + Page Up/Down)向上/向下滚动到给定的窗格。

例如,如果 tmux 窗口被分成两个垂直窗格,我可以使用键盘在其中一个窗格上滚动,而另一个窗格则不滚动。

是否可以 ?

这是我的 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

答案1

这里有一个解决方案,它应该只与您的肌肉记忆一起工作,允许您像在普通终端中一样使用Shift+PageUpShift+ 。PageDown

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

如果您使用 Vim,您将需要有条件地启用此绑定,否则当您PageUp在 tmux 内的 vim 中使用 等时它会弄乱一切。

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

(感谢@mjwhitta 的解决方案,它有所改进)

答案2

要向上滚动,您可以执行以下操作:

bind -n S-Pageup copy-mode -u

上述方法似乎在 Mac 上不起作用,因此我进行了测试:

bind -n S-Up copy-mode -u

据我所知,按下 S-Up 后,您可以继续使用 S-Up 或仅使用 Page-Up 继续向上滚动。您可以使用 Page-Down 向下滚动。这些并不是您正在寻找的按键绑定,所以我很抱歉。我希望这应该能让您更接近目标。

编辑:

我刚刚测试过:

bind -n Pageup copy-mode -u

这样您就可以使用向上翻页和向下翻页。

答案3

是的,我知道这个问题已经很老了,但是在谷歌搜索结果中排名并不靠后,我只是花了很多时间来寻找如何解决这个问题的方法,因为几乎没有谷歌搜索结果包含答案,只有问题。

据我所知,在复制模式下只有一个窗格会滚动。要进入复制模式,您可以使用,然后使用和prefix-[滚动,或者您可以设置自己的键绑定(在配置文件中),在 emacs 模式下如下所示:C-upC-down

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

这将设置组合键Shift+PageUpShift+PageDown分别向上滚动半页处于复印模式时。当您使用 vi 模式时,您需要将其更改为如下内容:

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

现在,如果您想“自动”进入复制模式并且不想使用,prefix-[您可以将以下行添加到您的配置文件中:

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

这将打开复制模式,并在编辑模式(默认模式)下按Shift+时向上滚动一页(整页)。如果只打开复制模式而不向上滚动一页,只需省略。如果您想向上/向下滚动整页或仅滚动一行,您可以使用关键字,或使用其中一个命令PageUp-upage-upscroll-up

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

查看要使用的选项和默认键绑定的完整列表。

答案4

要使用当前版本的 tmux 来具体完成问题所问的问题,您需要:

bind -n S-Pageup copy-mode -eu
bind -n S-Pagedown send-key -X page-down

这与@jack-senechal的回答有两个重要区别:

复制模式的 -e 参数告诉它如果您向下滚动到底部则退出复制模式,因此如果您最终一直向下滚动则不必手动退出。

使用send-key -X代替send-key意味着向下翻页只会发送到复制模式,确保行为与您在 Xterm 上获得的行为相同,或者使用基于 libvte 的终端仿真器。(例如 gnome-shell 或类似程序。)

它适用于发送与 page up/down 相比 shift-page up/down 的唯一序列并使用 terminfo 指定的序列的终端。

因此:基于 libvte 的终端(gnome-terminal 和 company)、kitty、konsole、foot 和 terminology。

但不包括:xterm、pangoterm、cool-retro-term 或 qterminal。

不幸的是,对于后一组终端的用户来说,当 tmux 没有获得它识别为 shift-page up/down 的按键序列时,它真的无能为力。不过其他答案对这些情况有些用处。

相关内容