web-dev-qa-db-ja.com

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

参考までに、Mac OS XターミナルアプリでTmuxを使用しています。

157
Daya Sharma

これと同じ質問はかなり長い間私を悩ませてきました。ここに私が思いついた最高のものがあります。これを.tmux.confファイルに追加します。

bind -n C-k clear-history

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

ターミナル、iTerm、Konsoleの1キーコンボほどではありませんが、クリアヒストリを常に入力するよりも優れています。

187
juanpaco

@juanpacoが正しく述べているように、clear-historyはスクロールバックバッファーをクリアするコマンドです。
同じコマンドで画面の内容をクリアすることも好きです。 send-keys -Rを発行すると画面がリセット(クリア)されるため、.tmux.confで次のコードを使用します

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

これにより、画面とスクロールバックバッファがクリアされます。

52
z5h

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

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

プレフィックスのデフォルトは<Ctrl-b>です

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

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

22
JonnyRaa

CTRL-Lとクリア履歴を組み合わせたい場合は、これを~/.tmux.confに追加します。

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

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

20
plu

send-keys -Rを使用すると少し遅くなることがわかりました-これは、1つのコマンドで画面と履歴を消去する別の方法です

bind-key C send-keys "clear && tmux clear-history" \; send-keys "Enter"  

ネストされたtmux呼び出しは、より明白なものとして使用されます

bind-key C send-keys "clear" \; send-keys "Enter" \; clear-history

fails画面の現在のテキストを履歴から消去する-clear-historyコマンドは、キーを送信する別のスレッドで実行されるように見えます。

17
cage433

たいていの場合より簡単な方法で、clsというシェルスクリプトを作成し、画面とスクロールバックバッファーをクリアするたびに実行します。

これだけです:

cls

clear;
tmux clear-history;
10
Brad Parks

これはTMUX 2.6で最適に機能し、画面をクリアし、スクロールバックしますが、プロンプトはその後表示されたままです。

Ctrl-Lを使用

bind-key -n C-l send-keys C-l \; send-keys -R \; clear-history
7
ideasman42

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がオンになっている必要があります(これはデフォルトです)。

5
Phil

上記のいくつかに加えて、他のソースを使用して考え出しました:

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"および最後のsend-keys C-uは、シェルの内部履歴から最後のアイテムを消去します。上記の末尾のスペースがあっても、シェルの内部履歴には「clear ...」行が含まれます。送信してCtrl-uを押すとこれがなくなります。

最後に、iTermでctrl-kを設定してctrl-a kにマップします(tmuxプレフィックスをctrl-aに設定します)。これで、長年の作業からctrl-kを入力できます。そう。これを行うには、iTerm> Preferences> Profiles> Keysに進み、16進コード「0x01 0x6B」を送信するショートカットを追加します。 tmuxおよびiTermでの16進コードの使用に関する詳細情報を提供する素晴らしい記事がここにあります: http://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

Tmuxでctrl-kが得られます。まだ私にちょっとうんざりしているのは、プロンプトで現在入力されているものがある場合、tmuxなしの実際のctrl-kには問題がなく、画面をクリアしても入力した内容が保持されることです。前述のように、このアプローチでは、「clear ...」コマンドが失敗しないように、入力内容をクリアする必要があります。しかし、それは非常に近いです!

2
Brett

多くの研究と時間を費やした後。 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
Rahul Katariya

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

1
klebervirgilio

だから、私は pl のアプローチ 上から を使用していましたが、その制限にうんざりしていました(基本的に、⌃Lが無意味ですそれを理解するプログラムにパイプされない限り。)

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

# ⌃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つの重要な注意事項があります。これは目に見えないresizingシェルではない場合、クリアされるペインです。これにより、SIGWINCHesをリッスンする一部のコマンドラインアプリケーションでサイズ変更動作をトリガーできます。しかし、私の推論では、これは大きな問題ではないということです。なぜなら、これらは「クリア」しようとしない可能性が高いプログラムだからですとにかく

さらに、シェルの引用状況はすでに混乱しており、#{pane_current_command}を埋め込むときにmoreになりやすいので、default-command設定に基づいてこれを変更する必要がある場合があります。

"sh"に一致するコマンドの終了のテストにも同じことが当てはまります。 default-commandのような/bin/bash --loginまたはexecを含む複雑なものがある場合、actual command"sh"で終わっていない可能性があります。テスト対象を確認する場合は、⌃B :を使用してdisplay-message '#{pane_current_command}'を実行します。

1
ELLIOTTCABLE