在tmux中使用鼠标滚动外壳输出


255

tmux中,鼠标滚动无法像在没有tmux的情况下运行shell时(在Gnome Terminal中)那样工作。看来tmux发送鼠标滚动事件就像我按上/下键一样。但是我想让它滚动显示shell 输出历史记录。有没有办法使tmux像这样工作?

注意:我知道如何使用键盘滚动(由于这里还有另一个问题)。

我尝试在两个版本的tmux中滚动鼠标:


1
我认为bukzor的答案解决了tmux 1.5及更高版本的问题。
kynan 2011年

Answers:


252

在输出的历史记录中滚动您将使用^b+,[ 然后可以使用M + V向上翻页,使用^ V向下翻页。我不知道是否可以使用真正的PgUpPgDown不过。我的终端没有将这些密钥发送到tmux。相反,它会滚动自身,而不滚动tmux历史记录。

要退出复制模式,请按ESC键

要在此模式(称为复制模式)下使用鼠标,请按^b+ : 并输入以下内容:

setw -g mouse on

注意:在tmux <2.1中,该选项名为mode-mouse,而不是mouse

现在,当您更改为复印模式时,可以使用鼠标滚动浏览。如果需要,可以将此命令放在〜/ .tmux.conf中,以便每次运行tmux时都将其加载。

更新:从tmux 1.5开始,此选项使使用滚轮自动切换到复制模式并向后滚动tmux回滚缓冲区。没有必要先打Ctrl-B+ [。向下滚动到提示也会自动结束复制模式。


1
请注意,如果您已经具有正在运行的tmux服务器,则可能必须重新加载配置文件。blog.sanctum.geek.nz/reloading-tmux-config tmux源文件〜/ .tmux.conf
Allan Nienhuis

7
不是为我工作在OS X上
艾因

2
@Ain-现在有11个主要的OS X版本。我们到底在谈论哪个版本?
Ramhound

10
对于tmux> = 2.1,请参见@DannyRe的答案(当前距离很远)。
joelostblom

3
set -g mouse on在macOS tmux 2.1上为我工作
Miguel Mota

123

Tmux 2.1有一些更改

  • 鼠标模式已被重写。现在不再有以下选项:

    • 鼠标调整窗格
    • 鼠标选择窗格
    • 鼠标选择窗口
    • 模式鼠标

    相反,只有一个选项:“鼠标”完全打开了鼠标支持。

那会是

set -g mouse on
# to enable mouse scroll, see https://github.com/tmux/tmux/issues/145#issuecomment-150736967
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"

6
谢谢,现在选择窗格等工作,但滚动不起作用。为了使滚动再次起作用,请使用以下命令:github.com/NHDaly/tmux-scroll-copy-mode
Mahdi

1
很棒-甚至在cygwin上也可以使用-WINDOWS 7上的tmux
GWD

@Mahdi这似乎不适用于osx。有什么提示吗?
DiTTiD '02

2
bind在tmux 2.3上似乎不再需要了
Theron Luhn

2
为+1 set -g mouse on。先前的评论是正确的。不再需要绑定。
Dakusan

63

当前版本的tmux(1.5)允许您简单地将mode-mouse选项设置为on,并允许您使用鼠标滚轮滚动。

         mode-mouse [on | off]
                 Mouse state in modes.  If on, the mouse may be used to
                 enter copy mode and copy a selection by dragging, to
                 enter copy mode and scroll with the mouse wheel, or to
                 select an option in choice mode.

在我的.tmux.conf中:

set-window-option -g mode-mouse on

那就是你真正想要的行为!鼠标滚动启用复制模式,而不仅仅是滚动shell备用缓冲区。最终,这对我来说是从屏幕切换到tmux的动力。是否可以通过Shift + PgUp来获得相同的行为?
kynan 2011年

1
@kynan:我个人只是C-A PgUp这样做。您可以直接使用绑定上一页键tmux bind-key -n PPage copy-mode -u。如果您从本地终端解除绑定,则类似的样式应适用于shift + pageup。
bukzor 2012年

1
这导致了一种奇怪的行为,当我滚动回命令行时,我在CLI中插入了一个额外的字符,这通常导致我的第一个命令格式错误。真烦人。
克里斯·R

请注意,但是,这对于用鼠标触发滚动效果很好,在选择要单击鼠标中键粘贴的文本时会导致奇怪的行为。由于折衷是不可接受的,所以我最终选择了Cb pg上/下(默认)。
h7r

@ChrisR我也很明白这一点,而且不太一致。它是[M [M#[M [M#[M [M#[M [M#[M]类型的字符串?
伊利亚·林恩

53

在您的.tmux.conf中尝试一下

# Make mouse useful in copy mode
setw -g mode-mouse on

# Allow mouse to select which pane to use
set -g mouse-select-pane on

# Allow xterm titles in terminal window, terminal scrolling with scrollbar, and setting overrides of C-Up, C-Down, C-Left, C-Right
set -g terminal-overrides "xterm*:XT:smcup@:rmcup@:kUP5=\eOA:kDN5=\eOB:kLFT5=\eOD:kRIT5=\eOC"

# Scroll History
set -g history-limit 30000

# Set ability to capture on start and restore on exit window data when running an application
setw -g alternate-screen on

# Lower escape timing from 500ms to 50ms for quicker response to scroll-buffer access.
set -s escape-time 50

取自http://brainscraps.wikia.com/wiki/Extreme_Multitasking_with_tmux_and_PuTTY


+1 escape-time设置
Dakusan

对于其他任何人,.tmux.conf文件都位于您的主目录中。
user2647513

15

有人(从我失去的消息来源)建议将以下内容添加到~.tmux.conf

set -g terminal-overrides 'xterm*:smcup@:rmcup@'

我不知道它是如何工作或如何工作的,但是现在这使我可以在tmux会话中使用鼠标滚轮滚动而不必进入tmux的复制模式。我只是滚轮和BAM!有用。请注意,我正在使用terminal.app,但是我记得OP专门针对给出了答案gnome-terminal


1
杰德,谢谢你!您的建议也适用于gnome-terminal。我将尝试使用此设置一段时间。但这有一个缺点:鼠标滚动现在无法按预期进行less。如果我less在里面加载tmux,鼠标滚动不会滚动打开的文件less。滚动整个终端。奇怪的是,vimtmux您的设置中,其行为符合预期。
user31494 2011年

2
请注意,从tmux 1.5开始,此setw -g mode-mouse on选项已被该选项取代,该选项使用鼠标滚轮进行复制模式回滚。
kynan 2011年

3
解释是此选项禁用了终端的备用屏幕上的滚动锁定,这在大多数情况下是理想的,因为请求备用屏幕缓冲区(vi,less,tmux等)的应用程序提供了自己的滚动功能。通过覆盖tmux中的此锁定,可以滚动终端的备用屏幕缓冲区,这在少数情况下不会产生期望的结果。有关解释备用屏幕的报价,请参见此答案man xterm
kynan 2011年

las,这在iTerm中不起作用
Suan

我在iTerm 2中获得了积极的结果
Keith Smiley

5

tmux 2.1引入了新的鼠标绑定。

我今天才写这些绑定。不在Vim中时,它将鼠标滚轮与箭头无缝绑定,因为Vim能够解释原始的鼠标滚轮代码(例如,根据鼠标悬停在哪个Vim窗口上,为您选择滚动哪个Vim窗口)。

这意味着我们最终只能使用鼠标来查看多个手册页以及接受箭头键的任何其他内容。您可以if根据需要扩展和链接逻辑,以为您的应用程序实现更多逻辑。

bind -n WheelUpPane if "[[ #{pane_current_command} =~ vim ]]" "select-pane -t = ; send-keys -M" "select-pane -t = ; send-keys Up"
bind -n WheelDownPane if "[[ #{pane_current_command} =~ vim ]]" "select-pane -t = ; send-keys -M" "select-pane -t = ; send-keys Down"

借助这种新的滚轮绑定功能,可以编写鼠标滚轮脚本以执行您喜欢的任何上下文相关的行为。


我现在只是想让窗格边框上的鼠标滚轮做一些有趣的事情。大概我要做的不是在边界上映射轮,而是在状态线上完成时映射它以循环tmux窗口。
史蒂文·卢

什么是您的Github链接?我想跟上您的努力!我正在寻找的另一个功能是双击该单词到X剪贴板,就像在Tmux之外一样。
joeytwiddle

@joeytwiddle我强烈推荐github.com/NHDaly/tmux-better-mouse-mode,请参阅我的其他答案
Steven Lu

3

侏儒终端做了一些巧妙的技巧,在受限的“常规”滚动条件下将鼠标滚动事件转换为向上和向下箭头键。例如,当您查看使用一些文本less(这种情况尤其是当你正在阅读一个人),你可以滚动使用的内容jk和箭头键。但gnome-terminal,你可以做到这一点鼠标滚动,感谢提到伎俩。

因此,我想tmux对终端进行一些“捕获”,就像less- gnome-terminal踢进去的机制一样:鼠标滚动转换为向上/向下箭头键的按下。

您可以在配置文件设置中关闭此功能,并在任何情况下进行常规滚动。只需取消标记“滚动”标签中的最后一个复选框:复选框


谢谢您的解释,uldtko!但这并不能解决鼠标滚动问题。是的,关闭了该选项后,将gnome-terminal停止发送三次滚动^[[A并按^[[B鼠标滚动。更好tmux^[[A^[[A^[[A在某些程序中不难看,在命令历史记录中也不丑陋),但是现在less停止了鼠标滚动。
user31494 2010年

1
乌克兰文?(由i角色猜测)
dotancohen 2013年


0

您可以结合其他答案的绑定思想来获得令人满意的滚动行为:在vim中工作,可在终端上自动更改为复制模式,并在到达底部时退出,仍然允许您在man,less和journalctl中使用鼠标滚轮。

我的代码:

bind -n WheelUpPane if -t = "test $(echo #{pane_current_command} |grep -e 'man' -e 'less' -e 'journalctl')" "select-pane -t = ; send-keys Up Up Up Up"  "if-shell -F -t = '#{?mouse_any_flag,1,#{pane_in_mode}}' 'send-keys -M' 'select-pane -t = ; copy-mode -e; send-keys -M'"
bind -n WheelDownPane if -t = "test $(echo #{pane_current_command} |grep -e 'man' -e 'less' -e 'journalctl')" "select-pane -t = ; send-keys Down Down Down Down"  "if-shell -F -t = '#{?mouse_any_flag,1,#{pane_in_mode}}' 'send-keys -M' 'select-pane -t = ; copy-mode -e; send-keys -M'"

您可以在grep -e'man'部分添加其他需要箭头键滚动的命令

我多次添加了发送键,因此鼠标滚轮上的一个刻度将一次滚动4行


0

如果您已经处于tmux会话中,则可以运行以下命令

set mouse on

提醒:要运行命令,请使用前缀,然后输入:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.