Tmuxでスクロールバックバッファーをクリアするにはどうすればよいですか?


回答:


211

これと同じ質問がかなり前から私を悩ませてきました。これが私が思いついた最高のものです。これを.tmux.confファイルに入れます。

bind -n C-k clear-history

これにより、ctrl-kがtmux clear-historyコマンドにバインドされます。bindの後に-nを指定すると、tmuxコマンドプレフィックス(デフォルトではctrl-b)を発行する必要がありません。私はbashを使用しているため、ctrl-lはすでにコマンドラインで「clear」と入力するのと同じことを行っています。これらの2つのキーを使用すると、すべてのスクロールバッファーを画面から移動し(「クリア」)、すべての履歴を削除する(tmuxの「clear-history」コマンド)、すばらしいctrl-l、ctrl-kコンボが得られます。

ターミナル、iTerm、またはKonsoleの1キーのコンボほどきれいにはなりませんが、常にclear-historyを入力するよりも優れています。


15
いいね。私はbind k send-keys "clear"\; send-keys "Enter"クリア部分について行ってきましたが、ビルトインを使用する方ctrl+lが簡単clear-historyで、スクロールバック履歴を取り除くことは良い追加です。
Henrik N

1
このバインディングにより、ペインがねじ込まれ、すべてのペインからすべてのテキストが削除され、ペインの周囲の境界が削除されます。それについてどう思いますか?
Ian Vaughan 2013年

うわぁ。どのシェルプログラムを使用していますか?偶然にも、ctrl + kに対して定義されたいくつかの動作がありますか?
juanpaco 2013年

iTerm2。ctrl + kはすでにtmuxバインディングセットなしでこれを実行しているので、iTerm2マッピングである必要があります。
Ian Vaughan 2013年

変だ。私もiTerm2を使用しています。しばらく更新していないのでバージョン違いかもしれません。vimバインディングで問題が発生したため、Ckも使用しなくなりました。今はCnを使っています。
juanpaco 2013年

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 2014年

6
知らない(私が知らなかったように)場合は、clear-historyコマンドを入力する状態に到達するには、を押してCtrl+Bから、コロン(:)でコマンドを開始します。
palswim 2014年

1
@volpato私はあなたのアプローチが好きですが、それでもスクロールバックにバッファの「画面」が1つ残っています。なぜだかわかりません。-Rはプロンプトを空白にしますが、最後に余分なCmを追加することで「解決」しました(ただし、2行目に表示されます)。
Gdogg、2015

2
これをに凝縮できsend-keys -R C-l \; clear-historyます。
ivan

35

ここでのすべての答えは、新しいキーバインディングの追加について話します。

たまにそれをしたいだけなら、マッピングはまったく必要ありません...

接頭辞のデフォルトは <Ctrl-b>

入力するだけで<prefix>:、関連するペインで、次に入力clear-historyしてEnterキーを押します。

tmuxの優れた点の1つは、そのようなコマンドを実行できること、またはシェルでスクリプトを実行できること、またはスクリプトでスクリプトを実行できること、tmux commandまたはキーボードショートカットを作成できることです。


8
最初の3文字を入力してから、最初にでcleオートコンプリートし<tab>、2回目にを使用<up arrow>して前のエントリにアクセスできます。この方法はかなり高速です。
bct 2018

1
これは機能しません<Ctrl-b> the 。c`キーを押してから入力を開始すると、新しいウィンドウを作成するように設定されているためです。
フラクチャー

@fraxture誤解していると思います-<Ctrl-b>を押し:た後、それを押すとインタラクティブなプロンプトが表示されます-ここに「c」を入力します
JonnyRaa

21

CTRL-Lplus clear-history を組み合わせる場合は、これを以下に追加します~/.tmux.conf

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

これは、たとえばMySQLシェルを使用している場合でも機能します。


1
これは、たとえば、中に動作しないようtail -f some.logですよね?ctrl-Zこれと組み合わせる方法はありますか?それを正しく理解しているように見えます。
アーロンヒブラルター2015年

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
この方法には注意点が1つあります。アクティブペインに書き込まれる文字列として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"
サンティP.

12

ほとんどの場合よりもはるかに簡単ですが、私clsはと呼ばれるシェルスクリプトを作成し、画面とスクロールバックバッファをクリアしたいときに実行します。

これだけです:

cls

clear;
tmux clear-history;

3
しかし、コマンドラインにアクセスできない場合はどうでしょう。サーバーが実行されていて、ログを監視しているときなどです。
zudduz 2016年

どこからログを監視しますか?ウェブサーバーを介して?もしそうなら、なぜtmuxが関係しているのかわかりませんか?
Brad Parks

1
サーバーログとvimエディターを同時に監視できるのは素晴らしいことです。
zudduz 2016年

tmuxスプリットを使用していますか?そうでない場合は、ウィンドウを2つに分割してログを1つに表示し、tmuxセッション内で「tmux split」を実行するだけでvimを使用します。
Brad Parks

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'

これには、tmuxオプションalternate-screenをオンにする必要があります(デフォルトではオンになっています)。


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"の先頭のスペースは、コマンドが履歴ファイルに書き込まれるのを防ぎます(先頭のスペースをこのように処理するようにシェルを設定している場合)。google "hist ignore space" +シェルの名前情報)。これはターミナルのctrl-kとよりインラインなので、このコマンドを履歴に表示しないようにします。

最初のsend-keys Cuとsend-keys Ckは、プロンプトで現在入力されているものをすべてクリアして、「clear && tmux clear-history」が成功するようにします(たとえば、プロンプトで「ABCDEFG」と入力して、 DとEの間のカーソル。これにより、「ABCD clear && tmux clear-historyEFG」がシェルに送信されず、失敗します)。

send-keys "Up"とlast send-keys Cuは、シェルの内部履歴から最後のアイテムを消去します。上記の末尾のスペースがあっても、シェルの内部履歴には「clear ...」行が含まれます。送信してCtrl-uでこれを取り除く。

最後に、iTermでctrl-kをctrl-a kにマップするように設定しました(tmuxプレフィックスをctrl-aに設定しているため)、何年にもわたって手がやりたいことであるctrl-kを入力できますそう。これを行うには、iTerm> [設定]> [プロファイル]> [キー]に移動し、16進コード「0x01 0x6B」を送信するショートカットを追加します。:とITERM tmuxのと16進コードを使用してより多くの情報を提供し、ここで素晴らしい記事がありますhttp://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/は、

それはかなり私にtmuxでctrl-kを与えます。まだ少し気が引ける唯一のことは、現在プロンプトで何かを入力している場合、tmuxのない実際のctrl-kは問題がなく、画面をクリアする間、入力した内容を保持することです。すでに述べたように、この方法では入力されたものをクリアする必要があるため、「clear ...」コマンドは失敗しません。しかし、それはかなりすごく近いです!


2

何故なの? bind -n C-l send-keys C-l


これをお勧めしない理由があるなら、私にも知りたいです。
ガストンサンチェス

2
まず第一に、それは必要ではありません。-n C-l基本的には「これをキャッチ」と言ってから、すぐに同じことを通過させます。(つまり、これは何もしません。)…次に、スクロールバックではなく画面をクリアするため、インテントがオフに⌃Lなります。ヒットしてから上にスクロールすると、すべてのスクロールバックがまだ記録されていることがわかります。この質問の目的は、表示されている端末ではなく、(tmuxの)スクロールバックをクリアすることです。⌃B [
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

そのため、このスレッドに対するさまざまな回答のさまざまなアプローチを改善しました。このアプローチは複雑ですが、シェル他のコマンドの両方で機能します

# ⌃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何かで試してみてください!


警告:

ここで重要な注意点が1つあります。これは、シェルでない場合、クリアされているペインのサイズを変更することです。これにより、SIGWINCHesをリッスンしている一部のコマンドラインアプリケーションでサイズ変更動作をトリガーできます。しかし、私の推論は、これは大きな問題ではないということです。なぜなら、これらはとにかく「クリア」しようとすることはほとんどないからです

また、シェル引用の状況はすでに混乱で、かつ簡単になることができ、より埋め込むときに1の#{pane_current_command}、ので注意してください、あなたはあなたに基づいて、これを変更する必要がありますdefault-command設定。

同じことが、コマンドマッチングの最後のテストにも当てはまり"sh"ます。のdefault-commandようなもの/bin/bash --loginや複雑なものがあるexec場合、実際のコマンドはで終了しない場合があり"sh"ます。テスト対象を確認⌃B :するdisplay-message '#{pane_current_command}'場合に使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.