tmuxキーを複数のコマンドにバインドする


37

マルチペインtmuxウィンドウを起動して、いくつかのサーバーパラメータを監視します。Ctrl-Sを使用すると、別のモニターコマンドで新しいウィンドウを開くことができます。

次に、Ctrl-Qをバインドして、複数のモニターで別のマルチペインウィンドウを開きます。キーを複数のコマンドにバインドするにはどうすればよいですか?私はそれらを連鎖しようとしました; および\; -何も助けません。以下の...の代わりに何を使うべきかアドバイスしてください。

新しいウィンドウを開いて、それに重なっているバックグラウンドコマンドを一時停止することは可能ですか?

    tmux new-session "monitor1" \;\
            split-window -v "monitor2" \;\
            select-pane -U \;\
            split-window -v -h -p 60 "monitor3" \;\
            bind-key -n C-s new-window "monitor4" \;\
            bind-key -n C-q "..."

回答:


37

Todd Freedは正しい\;です。これを行う「正しい」方法はを使用することです。並べ替え。しかし、障害があります。

tmuxに論理積を与えることにより、一連のtmuxコマンドを結合します;。したがって、tmuxをソースとするファイルでは、

new-session "monitor1" ; split-window -v "monitor2"

何らかの理由で、それをすべて1行にしたい場合。これで、その1行の複合ステートメントをtmuxシェルからコマンドに与えることもできますが、シェル;を別の引数として解釈できるようにエスケープする必要がありますtmux。したがって、シェルからの上記と同等のものは

$ tmux new-session "monitor1" \; split-window -v "monitor2"

同様に、tmux bind-keyコマンドは、tmux コマンドである一連の引数と、キーが押されたときに実行される引数を取ります。C-qtmuxをソースとするファイル内から上記のシーケンスにバインドする場合、次のようになります。

bind-key -n C-q new-session "monitor1" \; split-window -v "monitor2"

ここで; tmuxをエスケープして、tmuxbind-keyコマンドの終わりとして解釈するのではなくbind-keyC-qキーのバインド値として複合コマンドを形成するように指示する別の引数として解釈するようにしました。

では、tmuxにシェルからそれを行わせたい場合はどうなりますか?たくさんの脱出。

$ tmux bind-key -n C-q new-session "monitor1" \\\; split-window -v "monitor2"

まず、我々は脱出しなければならない\ し、;それぞれからシェルシェルは2つの文字をパスさせる、\;の引数としてtmux。これ;によりtmuxからエスケープされ、複合ステートメント全体がのバインディングとして割り当てられC-qます。


さて、このように複雑なtmuxセットアップを繰り返し使用する場合は、tmuxファイルを作成して保存することをお勧めします。

# In split-windows.tmux:
new-session "monitor1"
split-window -v "monitor2"
bind-key -n C-s new-window "monitor4"
# ...etc...

その後:

$ tmux source split-windows.tmux  # (or even make an alias for this)

その方法を維持する方がずっと簡単です。


3
見て少ない恐ろしいコマンドラインから複数のコマンドにキーを結合させるために、あなたはまた、文字列をエスケープすることができます\;$ tmux bind-key -n C-q new-session "monitor1" '\;' split-window -v "monitor2"
ティム・ヒープ

12

したがって、本当の答えは次のとおりです。バックスラッシュの後にセミコロンを付けてコマンドをチェーンします。

bind-key C send-keys foo \; send-keys bar

それをtmux.confに入れるか、tmuxの「:」プロンプトから実行します


これはすばらしく、ネストされたtmuxセッションを使用し、ネストされたtmuxウィンドウをナビゲートするのに役立ちました。
ポール

1
これは、シェルコマンドラインからは機能しませ。すなわち、 `tmux bind-key C send-keys foo \; センド・キーバーはすぐに『C『に『foo』をしかし版画』バー」結合の効果を持っている』。
Lqueryvg

はい、tmux内から実行します。明確にするために更新されました。
トッド解放

いいね!これは完全に機能します...ムチャスグラシアス!
ブラッドパークス

注:a; 単一引用符内ではエスケープする必要はありません
有効

2

これを行うには、小さな回避策が必要です。実行するスクリプト(ケースを適切に処理する)を提案する回答と同様に、「run-shell」を使用し、tmux自体をシェルコマンドとして呼び出すことで、より一般的に実行できます。

bind-key z run-shell "tmux send-keys "xyz" ; tmux clear-history; clear" 

「xyz」キー、tmux「clear-history」コマンドを送信し、「clear」シェル組み込みコマンドを呼び出します。

文字列全体は、単なる複数のシェルコマンドシーケンスです。


1

.tmux.confファイルのキーバインディングに次のようなものを追加できます。

bind q send-keys "/home/jackhab/bin/tmux-new-session.sh" \; send-keys "Enter"

そして、tmux-new-session.shあなたが持つことができます:

#! /usr/bin/env bash
tmux new-session "monitor1"
tmux split-window -v "monitor2"
tmux select-pane -U
tmux split-window -v -h -p 60 "monitor3"
...
exit

1

ここに示されているものはすべて機能しません。

bind q send-keys "command1" \; send-keys "command2"

command2をすぐに実行し、qはsend-keys "command1"にのみバインドされます

解決策は次のとおりです。

bind R source-file "$HOME/.tmux/reload.tmux"

ファイル〜/ .tmux / reload.tmuxに次のような複数のコマンドを追加します。

source-file "$HOME/.tmux.conf" 
display-message "Configuration reloaded."

1
ああ待って、ピージャが言ったことを使ってください(\\\;):
lzap
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.