Answers:
这个问题困扰我已有相当长的时间了。这是我想出的最好的。将其放入您的.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的一键组合,但它比一直输入清除历史记录要好得多。
bind k send-keys "clear"\; send-keys "Enter"
结算部分,但是使用内置ctrl+l
函数更简单,并且clear-history
摆脱回滚历史记录是一个很好的补充。
正如@juanpaco正确指出的那样,clear-history
是清除回滚缓冲区的命令。
我还要补充一点,我也想清除同一命令中屏幕上的内容。发出send-keys -R
重置(清除)屏幕,所以我在我的屏幕上使用以下内容.tmux.conf
bind-key b send-keys -R \; clear-history
这将清除屏幕和回滚缓冲区。
send-keys
:“ -R标志导致重置终端状态。” 您可能只需要更新。
bind -n C-l send-keys C-l \; clear-history
clear-history
命令的状态,请按Ctrl+B
,然后使用冒号(:
)启动命令。
send-keys -R C-l \; clear-history
。
此处的每个答案都涉及添加新的键绑定。
如果您只是偶尔想要这样做,则根本不需要映射。
前缀默认为 <Ctrl-b>
只需<prefix>:
在相关窗格中键入clear-history
,然后键入并按Enter。
关于tmux的一件很酷的事情是,您可以只运行类似的任何命令...,或者像在shell / script中运行它们一样tmux command
,或者为它们创建键盘快捷键。
cle
,然后<tab>
在第一次自动完成输入,然后在第二次使用<up arrow>
来访问上一个条目。这样就非常快。
<Ctrl-b> the
按下c`键后开始输入时会设置为创建新窗口。
:
它会给您一个交互式提示-这就是您键入'c'的位置
我发现使用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命令似乎在发送键的单独线程中运行。
bind-key E send-keys "C-k" \; send-keys "C-u" \; send-keys "clear" \; send-keys "Enter" \; run-shell "sleep .3s; tmux clear-history"
比大多数方法都更简单,我只是创建了一个名为的shell脚本cls
,并在需要清除屏幕和回滚缓冲区时运行它。
就是这样的:
cls
clear;
tmux clear-history;
我已经使用了上述内容中的一些以及其他来源:
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 ...”命令不会失败。但是,这太该死了!
为什么不? bind -n C-l send-keys C-l
-n C-l
基本上说“抓住这个”,然后您就可以立即传递相同的内容。(即,这是无操作的。)…其次,您的意图已关闭,因为⌃L
清除了屏幕,而不是向后滚动:如果单击⌃B [
然后向上滚动,则会看到所有回滚仍被记录;这个问题的目标是明确的是(TMUX的)回溯,不可见的终端。
经过大量的研究和花费时间。我在zsh和terminal.app上找到了对我最好的方法
我prefix-c
用来清除屏幕,prefix-C
清除历史记录和滚动缓冲区,并且上面没有任何行,因为我觉得这很烦人。
# 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
# 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
因此,我从上面一直使用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,这是无形地调整要清除的窗格的大小。这会在某些监听SIGWINCH
es的命令行应用程序中触发调整大小的行为。但是我的理由是,这并不是一个大问题,因为无论如何这些程序您很可能不会尝试“清除” 。
此外,壳报价的情况已经是一个烂摊子,并可以很容易地成为更一个嵌入的时候#{pane_current_command}
,所以一定要小心,你可能有这样的基础上您的修改default-command
设置。
我对命令匹配结束的测试也是如此"sh"
;如果您有default-command
类似之类的东西/bin/bash --login
或涉及复杂的东西exec
,实际的命令可能不会以结尾"sh"
; 如果要查看要测试的内容,请使用⌃B :
来执行display-message '#{pane_current_command}'
。