如何在Tmux中清除回滚缓冲区?

时间:2012-05-10 23:55:28

标签: terminal tmux

仅供参考,我通过Mac OS X终端应用程序使用Tmux。

14 个答案:

答案 0 :(得分:178)

同样的问题一直困扰着我。这是我提出的最好的。将它放入.tmux.conf文件中:

bind -n C-k clear-history

这将ctrl-k绑定到tmux clear-history命令。绑定后的-n使得您不必发出tmux命令前缀(默认情况下为ctrl-b)。我使用bash,所以ctrl-l已经相当于输入" clear"在命令行。使用这两个键,我得到一个很好的ctrl-l,ctrl-k组合,它将所有滚动缓冲区移出屏幕("清除"),然后删除所有历史记录(tmux" clear-history" command)。

它不如终端,iTerm或Konsole的1键组合清除它,但它比打字更好的世界一直都在清晰的历史中。

答案 1 :(得分:49)

正如@juanpaco所说,clear-history是清除回滚缓冲区的命令 我想补充一点,我也希望在同一个命令中清除屏幕上的内容。 发出send-keys -R重置(清除)屏幕,因此我在.tmux.conf

中使用以下内容

bind-key b send-keys -R \; clear-history

这会清除屏幕和回滚缓冲区。

答案 2 :(得分:21)

这里的每个答案都谈到了添加新的键绑定。

如果你只想偶尔做一下,你根本不需要绘图......

前缀默认为<Ctrl-b>

只需在相关窗格中输入<prefix>:,然后输入clear-history并按Enter键。

关于tmux的一个很酷的事情是,您可以运行任何类似的命令......或者在shell /脚本中运行它们,如tmux command ...或为它们创建键盘快捷键

答案 3 :(得分:19)

如果您要将CTRL-L加上明确历史记录合并,请将其添加到~/.tmux.conf

bind u send-keys C-l \; run-shell "sleep .3s" \; clear-history

如果您在MySQL shell中,这甚至可以工作。

答案 4 :(得分:17)

我发现使用send-keys -R有点慢 - 这是用一个命令清除屏幕和历史的另一种方法

bind-key C send-keys "clear && tmux clear-history" \; send-keys "Enter"  

嵌套的tmux调用用作更明显的

bind-key C send-keys "clear" \; send-keys "Enter" \; clear-history

失败从历史记录中清除屏幕的当前文本 - clear-history命令似乎在一个单独的线程中运行以发送密钥。

答案 5 :(得分:7)

比大多数人简单,我只是创建了一个名为cls的shell脚本,每当我想清除屏幕和回滚缓冲区时就运行它。

一切都是这样的:

<强> CLS

clear;
tmux clear-history;

答案 6 :(得分:6)

发现这在TMUX 2.6中效果最好,清除屏幕,回滚,但保持提示后显示。

使用Ctrl-L

bind-key -n C-l send-keys C-l \; send-keys -R \; clear-history

答案 7 :(得分:3)

Ctrl-L在控制台应用程序中用于重绘屏幕。我发现当绑定到send-keys -R时,它会导致箭头键在某些应用程序中不再正常运行(例如vim,mc)。

为了在控制台应用程序中保留重绘功能,我使用了:

bind-key -n C-l if-shell -F '#{alternate_on}' 'send-keys C-l' 'send-keys -R C-l; clear-history'

这需要启用tmux选项alternate-screen(默认情况下)。

答案 8 :(得分:2)

我已经使用了上面的一些以及其他资源来提出:

bind k send-keys C-u \; send-keys C-k \; send-keys " clear && tmux clear-history" \; send-keys "Enter" \; run-shell "sleep .3s" \; send-keys "Up" \; send-keys C-u 

“clear&amp;&amp; tmux clear-history”中的前导空格阻止命令被写入历史文件(假设你有shell设置以这种方式处理前导空格; google“hist ignore space”+ the shell的名称以获取更多信息)。我喜欢在我的历史记录中没有显示此命令,因为它更符合终端中的ctrl-k。

第一个发送密钥Cu和发送密钥Ck将清除当前在提示符下输入的内容,以确保“clear&amp;&amp; tmux clear-history”成功(例如,如果您输入了“ABCDEFG”) “在提示符下,将光标放在D和E之间,这样可以确保”ABCD清除&amp; tmux clear-historyEFG“不会发送到shell,这会失败)。

发送密钥“Up”和最后一个发送密钥C-u清除shell内部历史记录中的最后一项。即使有上面​​提到的尾随空间,shell的内部历史也将包括“clear ......”行。发送和Ctrl-u摆脱了这一点。

最后,在iTerm我设置ctrl-k映射到ctrl-a k(我将我的tmux前缀设置为ctrl-a),所以我可以输入ctrl-k这是我的手想做的很多多年这样做。我这样做,去iTerm&gt;偏好&gt;个人资料&gt;键并添加快捷方式以发送十六进制代码“0x01 0x6B”。这里有一篇很棒的文章,它提供了有关使用带有tmux和iTerm的十六进制代码的更多信息:http://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

这几乎给了我带tmux的ctrl-k。唯一仍然有点唠叨我的是,没有tmux的真正的ctrl-k没有问题,如果你当前在提示符下输入了一些内容并保留你在清除屏幕时输入的内容。如前所述,这种方法需要清除所输入的内容,以便“clear ...”命令不会失败。但它非常接近!

答案 9 :(得分:2)

经过大量的研究和花费时间。我在zsh和terminal.app上找到了最好的方法

我正在使用prefix-c来清除屏幕,prefix-C清除历史记录和滚动缓冲区,并且上面没有任何行,因为我发现它很烦人。

没有Vim

# clear screen
bind c send-keys 'C-l'
# clear screen and history
bind C send-keys -R \; send-keys C-l \; clear-history \; send-keys

使用Vim

# check if the pane is running vim
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \ | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"

# clear screen
bind c if-shell "$is_vim" "send-keys c" "send-keys 'C-l'"
# clear screen and history
bind C send-keys -R \; send-keys C-l \; clear-history \; send-keys

答案 10 :(得分:1)

为什么不呢? bind -n C-l send-keys C-l

答案 11 :(得分:1)

所以,我一直在使用plu的方法from above一段时间,但我厌倦了它的局限性(基本上,⌃L通过是没有意义的除非用管道输入了解它的程序。)

所以我在这个帖子的不同答案中改进了各种方法;虽然很复杂,但这种方法适用于 shell 其他命令

# ⌃K: Clears the current pane (from <https://stackoverflow.com/a/34162098>)
bind-key -n C-k \
   if-shell "test \"$(printf '#{pane_current_command}' | tail -c 2)\" = sh" \
      "send-keys C-l ; run-shell 'sleep .3s' ; clear-history" \
      "split-window -vp 100 ; clear-history -t ! ; kill-pane"

尝试使用tail -f /private/var/log/system.log或其他东西!

注意事项:

这里有一个重要的注意事项:如果它不是一个shell,那么它将被隐藏调整正在清除的窗格。这可以在一些监听SIGWINCH es的命令行应用程序中触发调整大小行为;但我的理由是,这不是一个大问题,因为那些程序你很可能不会试图“清除”无论如何

另外,shell引用的情况已经很乱了,嵌入#{pane_current_command}时很容易变成更多,所以要小心,你可能需要根据它来修改它您的default-command设置。

这同样适用于我对匹配"sh"的命令结尾的测试;如果您有default-command之类的/bin/bash --login或某些涉及exec的内容,则实际命令可能不会以"sh"结尾;如果您想查看正在测试的内容,请使用⌃B :执行display-message '#{pane_current_command}'

答案 12 :(得分:0)

要快速清除单个tmux窗格,可以设置别名...

# Tmux Clear pane
alias tc='clear; tmux clear-history; clear'

答案 13 :(得分:0)

如果您想要完全清除窗格,另一种选择是暂时将窗格大小调整为一行,清除历史记录,然后将其重新调整大小。这应该可以通过一个 tmux 命令链实现无闪烁。优点是无论窗格中正在运行什么程序,它都可以工作。当然这会让shell脚本逻辑复杂一些。

bind-key -n F11 run "
    if [[ #{window_panes} == "1" ]] ; then
        tmux send-keys C-l; sleep 0.1 ; tmux clear-history ;
    else
        restored_height=$((#{pane_height} + #{pane_at_bottom}));
        tmux resize-pane -y 1 \\; clear-history \\; resize-pane -y \${restored_height} ;
    fi
"