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

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

这个问题一直困扰我很长一段时间。 这是我所想到的最好的。 把它放到你的.tmux.conf文件中:

bind -n Ck clear-history 

这将ctrl-k绑定到tmux clear-history命令。 绑定后的-n使得它不需要发出tmux命令前缀(默认情况下是ctrl-b)。 我使用bash,所以ctrl-l已经在命令行上input了“clear”。 用这两个键,我得到一个很好的ctrl-l,ctrl-k组合,它将所有的滚动缓冲区移出屏幕(“清除”),然后删除所有的历史logging(tmux“clear-history”命令)。

它不如terminal,iTerm或Konsole的1键组合清除它,但这是一个比打字清晰历史更好的世界。

正如@ juanpaco所说的, clear-history是清除回滚缓冲区的命令。
我会补充一点,我也喜欢在同一个命令中清除屏幕上的内容。 send-keys -R一个send-keys -R复位(清除)屏幕,所以我在我的.tmux.conf使用以下.tmux.conf

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

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

我发现使用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

无法从历史logging中清除屏幕上的当前文本 – 清除历史logging命令似乎在单独的线程中运行以发送密钥。

如果你想结合CTRL-L加上清除历史logging,把它添加到你的~/.tmux.conf

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

这甚至可以在你使用MySQL shell的情况下工作。

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

所有这一切是这样的:

CLS

 clear; tmux clear-history; 

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

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

“clear && tmux clear-history”中的前导空格可防止将命令写入历史logging文件(假设您的shell设置为以这种方式对待前导空格; google“hist ignore space”+您的shell的名称以获得更多信息)。 我喜欢这个命令不会出现在我的历史logging中,因为这与terminal中的ctrl-k更加内联。

第一个发送键Cu和发送键Ck将清除当前在提示符处input的内容,以确保“清除&& tmux清除历史logging”成功(例如,如果在提示符下input了“ABCDEFG”您的光标在D和E之间,这确保了“ABCD clear && tmux clear-historyEFG”不会被发送到shell,这将会失败)。

发送键“Up”和最后一个发送键Cu清除你的shell内部历史logging中的最后一项。 即使是上面提到的尾部空间,炮弹的内部历史也会包含“清晰”的线条。 发送和Ctrl-U摆脱这一点。

最后,在iTerm中,我设置了ctrl-k映射到ctrl-a k(我的tmux前缀设置为ctrl-a),所以我可以键入ctrl-k,这是我多年来所做的所以。 我这样做,通过转到iTerm>首选项>configuration文件>键,并添加一个快捷方式发送hex代码“0x01 0x6B”。 这里有一个很好的文章,它提供了有关在tmux和iTerm中使用hex代码的更多信息: http : //tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

这几乎给了我ctrl-K与tmux。 唯一还是有点麻烦的是,没有tmux的真正的ctrl-k没有问题,如果你现在有提示键入的东西,并保留你在清除屏幕时input的内容。 如前所述,这种方法需要清除input内容,因此“清除…”命令不会失败。 但它是非常接近!

所以,我一直在使用plu的方法一段时间,但是我受够了它的限制(基本上,除非通过程序来理解它,否则通过的内容是毫无意义的)。

所以我对这个线程的不同答案进行了改进, 虽然很复杂,但这种方法可以同时使用shell 其他命令

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

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


注意事项:

这里有一个重要的注意事项:这是不可见的调整窗格被清除,如果它不是一个壳。 这可能触发在侦听SIGWINCH es的某些命令行应用程序中调整行为的大小; 但我的推理是,这不是一个大问题,因为这些程序是你很可能不会试图“清除” 的程序

另外,shell引用的情况已经是一团糟了,embedded#{pane_current_command}时候很容易变成一个,所以要小心,你可能不得不根据你的default-command设置来修改它。

这同样适用于我testing匹配"sh"命令的结尾; 如果你有一个类似/bin/bash --login东西或者涉及到exec一些复杂的命令实际的命令可能不会以"sh"结尾。 使用⌃B :执行display-message '#{pane_current_command}'如果你想看看什么是testing。

为什么不? bind -n Cl send-keys Cl

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

我使用prefix-c来清除屏幕和prefix-C来清除历史logging和滚动缓冲区,不留上面的行,因为我觉得很烦人。

没有Vim

 # clear screen bind c send-keys 'Cl' # clear screen and history bind C send-keys -R \; send-keys Cl \; 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 Cl \; clear-history \; send-keys 

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

使用Ctrl-L

 bind-key -n Cl send-keys Cl \; send-keys -R \; clear-history 

在控制台应用程序中使用Ctrl-L来重画屏幕。 我发现绑定到send-keys -R ,会导致箭头键在某些应用程序(例如vim,mc)中不能正常工作。

为了在控制台应用程序中保留重画function,我使用了:

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

这要求tmux选项alternate-screen处于打开状态(默认情况下)。