参考までに、Mac OS XターミナルアプリでTmuxを使用しています。
これと同じ質問はかなり長い間私を悩ませてきました。ここに私が思いついた最高のものがあります。これを.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キーコンボほどではありませんが、クリアヒストリを常に入力するよりも優れています。
@juanpacoが正しく述べているように、clear-history
はスクロールバックバッファーをクリアするコマンドです。
同じコマンドで画面の内容をクリアすることも好きです。 send-keys -R
を発行すると画面がリセット(クリア)されるため、.tmux.conf
で次のコードを使用します
bind-key b send-keys -R \; clear-history
これにより、画面とスクロールバックバッファがクリアされます。
ここでのすべての回答は、新しいキーバインディングの追加について説明しています。
たまにそれをしたいだけなら、マッピングはまったく必要ありません...
プレフィックスのデフォルトは<Ctrl-b>
です
関連するペインに<prefix>:
と入力し、clear-history
と入力してEnterキーを押します。
Tmuxの優れた点の1つは、そのようなコマンドを実行できること、またはtmux command
のようなシェル/スクリプトで実行できること、またはキーボードショートカットを作成できることです。
CTRL-L
とクリア履歴を組み合わせたい場合は、これを~/.tmux.conf
に追加します。
bind u send-keys C-l \; run-Shell "sleep .3s" \; clear-history
これは、たとえばMySQLシェルを使用している場合でも機能します。
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コマンドは、キーを送信する別のスレッドで実行されるように見えます。
たいていの場合より簡単な方法で、cls
というシェルスクリプトを作成し、画面とスクロールバックバッファーをクリアするたびに実行します。
これだけです:
cls
clear;
tmux clear-history;
これはTMUX 2.6で最適に機能し、画面をクリアし、スクロールバックしますが、プロンプトはその後表示されたままです。
Ctrl-Lを使用
bind-key -n C-l send-keys C-l \; send-keys -R \; clear-history
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
がオンになっている必要があります(これはデフォルトです)。
上記のいくつかに加えて、他のソースを使用して考え出しました:
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 ...」コマンドが失敗しないように、入力内容をクリアする必要があります。しかし、それは非常に近いです!
多くの研究と時間を費やした後。 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
何故なの? bind -n C-l send-keys C-l
だから、私は 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シェルではない場合、クリアされるペインです。これにより、SIGWINCH
esをリッスンする一部のコマンドラインアプリケーションでサイズ変更動作をトリガーできます。しかし、私の推論では、これは大きな問題ではないということです。なぜなら、これらは「クリア」しようとしない可能性が高いプログラムだからですとにかく。
さらに、シェルの引用状況はすでに混乱しており、#{pane_current_command}
を埋め込むときにmoreになりやすいので、default-command
設定に基づいてこれを変更する必要がある場合があります。
"sh"
に一致するコマンドの終了のテストにも同じことが当てはまります。 default-command
のような/bin/bash --login
またはexec
を含む複雑なものがある場合、actual commandが"sh"
で終わっていない可能性があります。テスト対象を確認する場合は、⌃B :
を使用してdisplay-message '#{pane_current_command}'
を実行します。