![tmux - 使用 shift + page up/down 向上/向下滚动到窗格中](https://linux22.com/image/1393797/tmux%20-%20%E4%BD%BF%E7%94%A8%20shift%20%2B%20page%20up%2Fdown%20%E5%90%91%E4%B8%8A%2F%E5%90%91%E4%B8%8B%E6%BB%9A%E5%8A%A8%E5%88%B0%E7%AA%97%E6%A0%BC%E4%B8%AD.png)
我希望能够使用与 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+PageUp和Shift+ 。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-up
C-down
bind-key -t emacs-copy -n S-PPage halfpage-up
bind-key -t emacs-copy -n S-NPage halfpage-down
这将设置组合键Shift+PageUp和Shift+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-u
page-up
scroll-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 的按键序列时,它真的无能为力。不过其他答案对这些情况有些用处。