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


Answers:


211

这个问题困扰我已有相当长的时间了。这是我想出的最好的。将其放入您的.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“清除历史记录”命令)。

清除它的功能不如Terminal,iTerm或Konsole的一键组合,但它比一直输入清除历史记录要好得多。


15
真好 我一直在做bind k send-keys "clear"\; send-keys "Enter"结算部分,但是使用内置ctrl+l函数更简单,并且clear-history摆脱回滚历史记录是一个很好的补充。
Henrik N

1
此绑定将我的窗格拧紧,从所有窗格中删除所有文本,并删除它们周围的边框!有什么想法吗?
伊恩·沃恩

kes。您使用什么外壳程序?它是否偶然已经为ctrl + k定义了一些行为?
juanpaco

iTerm2。刚刚看到ctrl + k已经在没有tmux绑定集的情况下执行了此操作,因此它必须是iTerm2映射。
伊恩·沃恩

奇怪的。我也使用iTerm2。我已经有一段时间没有更新了,因此可能是版本差异。我也不再使用Ck了,因为那导致了我的vim绑定问题。我现在使用Cn。
juanpaco

58

正如@juanpaco正确指出的那样,clear-history是清除回滚缓冲区的命令。
我还要补充一点,我也想清除同一命令中屏幕上的内容。发出send-keys -R重置(清除)屏幕,所以我在我的屏幕上使用以下内容.tmux.conf

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

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


1
直接来自tmux文档send-keys:“ -R标志导致重置终端状态。” 您可能只需要更新。
z5h 2012年

20
使用-R的缺点是隐藏了当前输入行,这与使用Ctrl + l清除终端不同。我所做的是bind -n C-l send-keys C-l \; clear-history
volpato

6
对于不知道的人(例如我不知道),要进入输入clear-history命令的状态,请按Ctrl+B,然后使用冒号(:)启动命令。
palswim,2014年

1
@volpato我喜欢您的方法,但是我发现它仍然在回滚中留下了缓冲区的一个“屏幕”。不知道为什么。-R清除了提示,但我通过在末尾添加一个额外的Cm来“解决”了它(但随后将其放在第二行)。
Gdogg

2
您可以将此压缩为send-keys -R C-l \; clear-history
ivan

34

此处的每个答案都涉及添加新的键绑定。

如果您只是偶尔想要这样做,则根本不需要映射。

前缀默认为 <Ctrl-b>

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

关于tmux的一件很酷的事情是,您可以只运行类似的任何命令...,或者像在shell / script中运行它们一样tmux command,或者为它们创建键盘快捷键。


7
可以键入前三个字符cle,然后<tab>在第一次自动完成输入,然后在第二次使用<up arrow>来访问上一个条目。这样就非常快。
bct

1
这对我不起作用,因为在我<Ctrl-b> the 按下c`键后开始输入时会设置为创建新窗口。
fraxture,

@fraxture我认为您误会了-在按<Ctrl-b>然后按:它会给您一个交互式提示-这就是您键入'c'的位置
JonnyRaa

21

如果要结合使用CTRL-L清除历史记录,请将其添加到您的~/.tmux.conf

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

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


1
例如,这似乎不起作用tail -f some.log,对吧?有办法ctrl-Z与之结合吗?似乎能正确解决。
亚伦·吉布拉特

19

我发现使用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
这种方法有一个警告,那就是它仅适用于本地shell,因为它将tmux清除历史记录作为字符串发送到要写入活动窗格中。我已将其调整为:bind-key E send-keys "C-k" \; send-keys "C-u" \; send-keys "clear" \; send-keys "Enter" \; run-shell "sleep .3s; tmux clear-history"
Santi P.

12

比大多数方法都更简单,我只是创建了一个名为的shell脚本cls,并在需要清除屏幕和回滚缓冲区时运行它。

就是这样的:

cls

clear;
tmux clear-history;

3
但是,如果您无权访问命令行怎么办。例如,当服务器正在运行并且您正在查看日志时。
zudduz

您从哪里看日志?通过网络服务器?如果是这样,那么我不明白为什么涉及tmux?
布拉德·帕克斯

1
能同时观看服务器日志和vim编辑器真是太好了。
zudduz

您是否使用tmux分割?如果没有,只需将窗口分成2个,在其中一个中查看日志,然后通过在tmux会话中运行`tmux split“在另一个窗口中使用vim ...但是也许我不明白您在做什么?
布莱德·帕克斯

10

发现这在TMUX 2.6中最有效,它可以清除屏幕,向后滚动,但之后仍显示提示。

使用Ctrl-L

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

6

控制台应用程序中使用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'

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


3

我已经使用了上述内容中的一些以及其他来源:

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 && tmux clear-history”中的前导空格可防止将命令写入历史记录文件(前提是您已设置了Shell来以这种方式处理前导空格; google“ hist忽略空格” +您的shell名称以了解更多信息)信息)。我喜欢在我的历史记录中不显示此命令,因为它与终端中的ctrl-k更加内联。

第一个发送键Cu和发送键Ck将清除提示符下当前键入的任何内容,以确保成功执行“ clear && tmux clear-history”(例如,如果您在提示符下键入了“ ABCDEFG”,并且您的光标在D和E之间,这可以确保“ ABCD clear && tmux clear-historyEFG”不会发送到外壳,否则会失败)。

发送键“ Up”和最后一个发送键Cu清除外壳内部历史记录中的最后一个项目。即使有上面​​提到的尾随空格,shell的内部历史记录也会包含“ clear ...”行。发送并按Ctrl-u可以消除此问题。

最后,在iTerm中,我将ctrl-k设置为映射到ctrl-a k(我将我的tmux前缀设置为ctrl-a),所以我可以键入ctrl-k,这是我多年以来一直想做的事情所以。为此,请转到“ iTerm”>“首选项”>“配置文件”>“键”,并添加一个快捷方式来发送十六进制代码“ 0x01 0x6B”。这里有一篇很棒的文章,提供了有关在tmux和iTerm上使用十六进制代码的更多信息: http //tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

这几乎给了我使用tmux的ctrl-k。唯一让我感到困扰的是,如果您当前在提示符下键入了某些内容,并且没有清理,则真正的ctrl-k不会出现问题,并且在清除屏幕时将保留您键入的内容。如前所述,此方法需要清除键入的内容,以便“ clear ...”命令不会失败。但是,这太该死了!


2

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


我也想知道是否有理由不建议这样做。
加斯顿·桑切斯2015年

2
首先,这不是必需的:-n C-l基本上说“抓住这个”,然后您就可以立即传递相同的内容。(即,这是无操作的。)…其次,您的意图已关闭,因为⌃L清除了屏幕,而不是向后滚动:如果单击⌃B [然后向上滚动,则会看到所有回滚仍被记录;这个问题的目标是明确的是(TMUX的)回溯,不可见的终端。
ELLIOTTCABLE

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

2

为了快速清除单个tmux窗格,您可以设置一个别名...

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

1

因此,我从上面一直使用plu的方法已经有一段时间了,但是我受够了它的局限性(基本上,除非通过管道传递给理解它的程序,否则传递是没有意义的。)⌃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,这是无形地调整要清除的窗格的大小。这会在某些监听SIGWINCHes的命令行应用程序中触发调整大小的行为。但是我的理由是,这并不是一个大问题,因为无论如何这些程序您很可能不会尝试“清除” 。

此外,壳报价的情况已经是一个烂摊子,并可以很容易地成为一个嵌入的时候#{pane_current_command},所以一定要小心,你可能有这样的基础上您的修改default-command设置。

我对命令匹配结束的测试也是如此"sh";如果您有default-command类似之类的东西/bin/bash --login或涉及复杂的东西exec实际的命令可能不会以结尾"sh"; 如果要查看要测试的内容,请使用⌃B :来执行display-message '#{pane_current_command}'

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.