如何清除 Tmux 中的回滚缓冲区?
Posted
技术标签:
【中文标题】如何清除 Tmux 中的回滚缓冲区?【英文标题】:How can I clear scrollback buffer in Tmux? 【发布时间】:2012-05-19 14:19:56 【问题描述】:仅供参考,我正在通过 Mac OS X 终端应用程序使用 Tmux。
【问题讨论】:
这对我有用:notes.jerzygangi.com/… 【参考方案1】:同样的问题已经困扰了我很长一段时间。这是我想出的最好的。把它放到你的 .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 的 1 键组合来清除它,但它比一直输入清除历史要好。
【讨论】:
不错。清除部分我一直在做bind k send-keys "clear"\; send-keys "Enter"
,但是使用内置的ctrl+l
更简单,而clear-history
摆脱回滚历史是一个很好的补充。
这个绑定搞砸了我的窗格,从所有窗格中删除所有文本并删除它们周围的边框!有什么想法吗?
哎呀。你用什么shell程序?它是否已经为 ctrl+k 定义了一些行为?
iTerm2.刚刚看到ctrl+k在没有tmux绑定集的情况下已经这样做了,所以肯定是iTerm2映射。
很奇怪。我也使用 iTerm2。好久没更新了,可能是版本不一样。我也不再使用 C-k,因为这导致我的 vim 绑定出现问题。我现在用 C-n。【参考方案2】:
这里的每个答案都谈到添加新的键绑定。
如果你只是想偶尔做一次,你根本不需要映射......
前缀默认为<Ctrl-b>
只需在相关窗格中输入<prefix>
+ :
,然后输入clear-history
并按回车键。
如果您在命令行上,您可以在相关窗格中运行tmux clear-history
以获得相同的效果。
关于 tmux 的一个很酷的事情是,您可以运行任何类似的命令...或在 shell/脚本中运行它们,如 tmux command
... 或为它们创建键盘快捷键。
【讨论】:
可以输入前三个字符cle
,然后第一次用<tab>
自动补全,第二次用<up arrow>
访问上一个条目。这种方式相当快。
这对我不起作用,因为当我在点击<Ctrl-b> the
c` 键后开始输入时设置为创建一个新窗口。
@fraxture 我想你误解了 - 在你按下 :
它会给你一个交互式提示 - 那就是你输入'c'的地方tmux clear-history
以获得相同的效果。键绑定的答案确实使这比它必须的复杂得多(并且对于罕见的操作容易出错)。
你也可以像clear && tmux clear-history
一样使用【参考方案3】:
正如@juanpaco 正确指出的那样,clear-history
是清除回滚缓冲区的命令。
我要补充一点,我还想在同一命令中清除屏幕上的内容。
发出send-keys -R
会重置(清除)屏幕,因此我在.tmux.conf
中使用以下内容
bind-key b send-keys -R \; clear-history
这会清除屏幕和回滚缓冲区。
【讨论】:
使用 -R 的缺点是您当前的输入行被隐藏了,这与您使用 Ctrl+l 清除终端时不同。我所做的是bind -n C-l send-keys C-l \; clear-history
对于那些不知道(就像我不知道)的人,到达状态输入clear-history
命令,按Ctrl+B
,然后以冒号 (:
)。
@volpato 我喜欢你的方法,但我发现它仍然在向后滚动时留下一个缓冲区的“屏幕”。不知道为什么。 -R 将提示空白,但我通过在末尾添加一个额外的 C-m 来“解决”它(但随后将其放在第二行)。
旧线程,但我通过在clear-history
之后添加send-keys C-l
来修复提示问题。 IE。 bind -n C-l send-keys -R \; clear-history \; send-keys C-l
。这对我来说是最快的。
你可以把这个压缩成send-keys -R C-l \; clear-history
。【参考方案4】:
如果您想结合CTRL-L
和清除历史记录,请将其添加到您的~/.tmux.conf
:
bind u send-keys C-l \; run-shell "sleep .3s" \; clear-history
如果你在 mysql shell 中,这甚至可以工作。
【讨论】:
这似乎在tail -f some.log
期间不起作用,对吧?有没有办法将ctrl-Z
与这个结合起来?似乎可以做到。【参考方案5】:
我发现使用 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 命令似乎在单独的线程中运行以发送密钥。
【讨论】:
这种方法有一个警告,它只适用于本地 shell,因为它将 tmux clear-history 作为字符串发送到活动窗格。我已将其改编为:bind-key E send-keys "C-k" \; send-keys "C-u" \; send-keys "clear" \; send-keys "Enter" \; run-shell "sleep .3s; tmux clear-history"
【参考方案6】:
比大多数都简单,我刚刚创建了一个名为 cls
的 shell 脚本,并在我想清除屏幕和回滚缓冲区时运行它。
就是这样:
cls
clear;
tmux clear-history;
【讨论】:
但是如果您无法访问命令行怎么办。例如,当服务器正在运行并且您正在查看日志时。 您会从哪里查看日志?通过网络服务器?如果是这样,那我不明白为什么要涉及 tmux? 很高兴能够同时查看服务器日志和您的 vim 编辑器。 你使用 tmux 拆分吗?如果没有,只需将您的窗口分成 2 个,并在一个中查看您的日志,并通过在您的 tmux 会话中运行“tmux split”在另一个中使用 vim ......但也许我没有得到你在做什么? 【参考方案7】:发现这在 TMUX 2.6 中效果最好,清屏、回滚,但之后保持提示显示。
使用 Ctrl-L
bind-key -n C-l send-keys C-l \; send-keys -R \; clear-history
【讨论】:
【参考方案8】: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
(默认情况下)。
【讨论】:
【参考方案9】:我已经使用了上面的一些以及其他资源来提出:
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 设置以这种方式处理前导空格;谷歌“hist ignore space”+您的名称壳了解更多信息)。我希望这个命令不会出现在我的历史记录中,因为它更符合终端中的 ctrl-k。
第一个 send-keys Cu 和 send-keys Ck 将清除当前在提示符下键入的任何内容,以确保“clear && tmux clear-history”成功(例如,如果您在提示并将光标放在 D 和 E 之间,这样可以确保不会将“ABCD clear && tmux clear-historyEFG”发送到 shell,否则会失败)。
发送键“Up”和最后发送键 C-u 清除 shell 内部历史记录中的最后一项。即使有上面提到的尾随空格,shell 的内部历史也将包括“clear ...”行。发送起来 Ctrl-u 摆脱这个。
最后,在 iTerm 中,我将 ctrl-k 设置为映射到 ctrl-a k(我的 tmux 前缀设置为 ctrl-a),所以我可以输入 ctrl-k,这是我的双手想要做的事情多年来这样做。我这样做是通过转到 iTerm > Preferences > Profiles > Keys 并添加一个快捷方式来发送十六进制代码“0x01 0x6B”。这里有一篇很棒的文章,提供了更多关于在 tmux 和 iTerm 中使用十六进制代码的信息:http://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/
这几乎给了我使用 tmux 的 ctrl-k。唯一让我感到烦恼的是,如果您当前在提示符下输入了某些内容,那么没有 tmux 的真正 ctrl-k 不会有问题,并且会在清除屏幕时保留您输入的内容。如前所述,这种方法需要清除输入的内容,这样“clear ...”命令才不会失败。但它非常接近!
【讨论】:
【参考方案10】:为了快速修复清除单个 tmux 窗格,您可以设置一个别名...
# Tmux Clear pane
alias tc='clear; tmux clear-history; clear'
【讨论】:
【参考方案11】:所以,我已经使用plu 的方法from above 有一段时间了,但我已经厌倦了它的局限性(基本上,除非通过管道传输到明白了。)
因此,我在此线程的不同答案中改进了各种方法;虽然复杂,但这种方法适用于shell 和其他命令:
# ⌃K: Clears the current pane (from <https://***.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
什么的吧!
注意事项:
这里有一个重要的注意事项:如果它不是一个外壳,这是在无形地调整被清除的窗格。这可能会在某些侦听SIGWINCH
es 的命令行应用程序中触发调整大小行为;但我的理由是这不是什么大问题,因为这些程序你很可能不会尝试“清除”无论如何。
另外,shell引用的情况已经很乱了,嵌入#pane_current_command
时很容易变成更多,所以要小心,你可能需要根据你的@来修改它987654328@设置。
这同样适用于我对匹配 "sh"
的命令结尾的测试;如果您有类似/bin/bash --login
的default-command
或涉及exec
的复杂内容,则实际命令 可能不会以"sh"
结尾;如果您想查看正在测试的内容,请使用 ⌃B :
执行 display-message '#pane_current_command'
。
【讨论】:
【参考方案12】:经过大量研究和花费时间。我在 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
【讨论】:
【参考方案13】:为什么不呢? bind -n C-l send-keys C-l
【讨论】:
我也想知道是否有理由不推荐这个。 首先,这不是必需的:-n C-l
基本上是说“抓住这个”,然后你会立即传递同样的东西。 (即这是一个无操作。)... 其次,您的 intent 已关闭,因为 ⌃L
清除 屏幕,而不是向后滚动:如果您点击 @987654324 @ 然后向上滚动,你会看到所有的回滚仍然被记录;这个问题的目标是清除 that (tmux's) 的回滚,而不是可见的终端。【参考方案14】:
如果你用clear
清屏,你可以检查TMUX
是否被设置,并相应地创建一个别名。
把它放在你的 .bashrc 中:
if [[ $TMUX ]]; then
alias clear='clear && tmux clear-history'
fi
【讨论】:
【参考方案15】:如果您想要完全清除窗格,另一种选择是将窗格临时调整为一行,清除历史记录,然后重新调整大小。这应该可以使用一个 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
"
【讨论】:
以上是关于如何清除 Tmux 中的回滚缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章
如何清空(清除)Android中的logcat缓冲区[重复]