参考までに、私は Mac OS X ターミナル アプリを通じて Tmux を使用しています。
15 に答える
この同じ質問は、かなり長い間私を悩ませてきました。これが私が思いついた最高のものです。これを .tmux.conf ファイルに入れます。
bind -n C-k clear-history
これにより、ctrl-k が tmux clear-history コマンドにバインドされます。bind の後に -n を指定すると、tmux コマンド プレフィックス (デフォルトでは ctrl-b) を発行する必要がなくなります。私は bash を使用しているので、ctrl-l はコマンド ラインで「clear」と入力するのと同じことを既に実行しています。これらの 2 つのキーを使用すると、ctrl-l、ctrl-k の素晴らしい組み合わせが得られます。これは、すべてのスクロール バッファーを画面から移動し (「クリア」)、そのすべての履歴を削除します (tmux の「clear-history」コマンド)。
ターミナル、iTerm、または Konsole の 1 キー コンボほどクリアにはなりませんが、クリア履歴を常に入力するよりははるかに優れています。
@juanpacoが正しく述べたようにclear-history
、スクロールバックバッファをクリアするコマンドです。
同じコマンドで画面に表示されているものもクリアしたいということを付け加えておきます。を発行するsend-keys -R
と画面がリセット (クリア) されるので、次のコードを使用します。.tmux.conf
bind-key b send-keys -R \; clear-history
これにより、画面とスクロールバック バッファがクリアされます。
使用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 コマンドは、キーを送信するために別のスレッドで実行されているようです。
これは TMUX 2.6 で最適に機能し、画面をクリアしてスクロールバックしますが、プロンプトは表示されたままにします。
Ctrl-L を使用
bind-key -n C-l send-keys C-l \; send-keys -R \; 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」の先頭のスペースは、コマンドが履歴ファイルに書き込まれるのを防ぎます (先頭のスペースをこのように処理するようにシェルを設定している場合、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 は、シェルの内部履歴から最後のアイテムをクリアします。上記の末尾のスペースがあっても、シェルの内部履歴には「クリア...」行が含まれます。上に送信して Ctrl-u を押すと、これが解消されます。
最後に、iTerm で ctrl-k を ctrl-a k にマップするように設定しました (tmux のプレフィックスを ctrl-a に設定しています)。それで。これを行うには、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 ...」コマンドが失敗しないように、入力された内容をクリアする必要があります。でもめちゃくちゃ近い!
というわけで、上から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 つあります。これは、シェルでない場合、クリアされるペインのサイズを目に見えない形で変更することです。SIGWINCH
これにより、 esをリッスンする一部のコマンドライン アプリケーションでサイズ変更動作がトリガーされる可能性があります。しかし、私の推論は、これは大きな問題ではないということです。なぜなら、これらはプログラムであり、とにかく「クリア」しようとしない可能性が非常に高いからです。
さらに、シェル クォートの状況はすでに混乱しており、埋め込み時に簡単にさらに#{pane_current_command}
複雑になる可能性があるため、設定に基づいてこれを変更する必要がある場合があることに注意してくださいdefault-command
。
同じことが、そのコマンド マッチングの終わりのテストにも当てはまり"sh"
ます。default-command
のようなもの/bin/bash --login
や複雑なものがある場合exec
、実際のコマンド"sh"
は;で終わらない場合があります。何に対してテストされているかを確認したい場合は⌃B :
、実行するために使用します。display-message '#{pane_current_command}'
多くの研究と時間を費やした後。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
ヴィムで
# 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
なぜだめですか?bind -n C-l send-keys C-l