如何清除 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 什么的吧!


注意事项:

这里有一个重要的注意事项:如果它不是一个外壳,这是在无形地调整被清除的窗格。这可能会在某些侦听SIGWINCHes 的命令行应用程序中触发调整大小行为;但我的理由是这不是什么大问题,因为这些程序你很可能不会尝试“清除”无论如何

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

这同样适用于我对匹配 "sh" 的命令结尾的测试;如果您有类似/bin/bash --logindefault-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 中的回滚缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

在终端(iTerm2)中留下 tmux 回滚

如何清空(清除)Android中的logcat缓冲区[重复]

在tmux缓冲区中搜索

“CLS”等同于BASH?

Python中的UDP套接字:如何清除缓冲区并忽略oldes消息

转设置SecureCRT会话的缓冲区大小