私は最近tmuxに触れていて、多くの時間を費やしていますが、何が間違っているのかわかりません。私の考えでは、いくつかのレイアウトは許可されていません。エラーや警告は発生しませんが、私の要求は単に無視されるようです。これが私の目標です。
私が達成できたのは次のとおりです。
これは私が実行しているシェルスクリプトです。
#!/bin/bash
SESSION=$USER
tmux -2 new-session -d -s $SESSION
tmux new-window -t $SESSION:1 -n 'Logs'
tmux split-window -h
tmux split-window -h
tmux split-window -v
tmux split-window -v
tmux select-pane -t 0
tmux resize-pane -L 100
tmux send-keys 'watch -n1 "cat /proc/cpuinfo | grep "MHz" | sort -r | head -32"' C-m
tmux select-pane -t 1
tmux resize-pane -L 100
tmux send-keys 'watch -n1 "cat /proc/cpuinfo | grep "MHz" | sort -r | tail -32"' C-m
tmux send-keys 'watch -n1 inxi -s' C-m
tmux select-pane -t 2
tmux resize-pane -U 50
tmux send-keys 'watch -n1 ${HOME}/bin/clean_sensors.sh' C-m
tmux select-pane -t 3
tmux send-keys 'watch -n1 rocm-smi' C-m
tmux select-pane -t 4
tmux resize-pane -U 7
tmux send-keys 'watch -n1 ${HOME}/bin/gpu_sensors.sh' C-m
# # Set default window
tmux select-window -t $SESSION:1
# Attach to session
tmux -2 attach-session -t $SESSION
編集する: @KamilMaciorowskiのソリューションの結果は次のとおりです。
ウィンドウの数は正確ですが、相対的なサイズはまだ正しくないことがわかります。
ベストアンサー1
私の要求は無視されたようです
どのリクエストが無視されたかはわかりません。あなたのスクリプトは私にある程度動作します。 tmuxサーバーを実行せずに再実行すると、何も無視されないようです。 tmuxサーバーがすでに実行されている場合は問題があります。
- セッションがすでに存在し、誰かが(アクティブに)使用している可能性があります。
- ウィンドウがすでに存在する可能性があります。
- あなたの
split-window
コマンドは他の(既存の)ウィンドウをターゲットにすることができます。
私の考えでは、いくつかのレイアウトは許可されていません。
既存のレイアウトを使用し、より多くのタスクを実行して目的のレイアウトを取得することが目標である場合後ろにすると、目的の右上または右下のウィンドウを簡単に取得できないので難しいでしょう。後ろに左側の「33%」列全体が2つの「50%」ウィンドウに分割されます。分割を別の順序で実行する必要があります。
順序を理解する1つの方法は、紙にレイアウトを描画し、はさみで切り取ることです。まっすぐ減らす渡すしたがって、各カットは現在のブロックを2つの小さなブロックに分割します。またはチョコレートバーを壊すと想像してみてください。
必要なレイアウトの可能なシナリオは次のとおりです。
+---------------------+
| 1 |
|22222221 |
| 3 1 |
| 3 1#############|
| 3 1 |
|22222221 |
| 1 |
+---------------------+
この数字は切断する必要がある順序を示します。とマークされたカットは、#
右側の列の複数のカットを表し、前1
、前、後、または後2
に任意の順序でカットを作成できます3
。これらの#
傷は問題にとって重要ではありません。重要なことは、前後に2つの2
カット(順番に関係なく)をしなければならないということです。1
今後 3
。スクリプトは3
作成せずにカットを実行する2
ので、必要なものを得るための直接的な方法はありません。
はいsplit-window -f
、単一のウィンドウを分割する代わりに、ウィンドウ全体の高さまたはウィンドウ全体にわたる新しいウィンドウを作成します。ある程度の柔軟性を提供し、ウィンドウをさまざまな順序で作成できますが、すでに実装されているレイアウトから目的のレイアウトを取得するのに役立ちません。
比較すると、これは実際には不可能なレイアウトだと思います。
+---------------------+
| # |
| # |
| ##############|
| | | |
| | | |
|---------------| |
| | |
+---------------------+
実際にはさみで切ることができますが、tmuxでは切れません。少なくともハサミを使用した最初のパスでは、2つの別々のシートを作成するために曲げる必要があるからです。最初のカットの例は、#
人の姿で描かれています。これを「通過」しない2つのカットとして解釈できるので、tmuxの場合、この解釈は何も変更せず、まだ不可能です。
これはtmux 2.3で動作するサンプルスクリプトです。注と改善点はコードの下に説明としてリストされているので、スクリプトを実行する前にお読みください。
#!/bin/sh
session="$USER"
window="$session:1"
lines="$(tput lines)"
columns="$(tput cols)"
tmux -2 new-session -d -x "$columns" -y "$lines" -s "$session" 'echo "step -1"; bash'
tmux new-window -t "$window" -n 'Logs' 'echo "step 0"; bash' || exit
tmux split-window -t "$window" -h -p 67 -d 'echo "step 1"; bash'
tmux split-window -t "$window" -v -p 10 -b -d 'echo "step 2a"; bash'
tmux split-window -t "$window" -v -p 22 -d 'echo "step 2b"; bash'
tmux split-window -t "$window" -h -p 50 'echo "step 3"; bash'
tmux split-window -t "$window.{top-right}" -v -p 55 -d
tmux split-window -t "$window.{top-right}" -v -p 64
tmux select-pane -t "$window.{bottom-right}"
tmux split-window -t "$window" -v -p 67
tmux split-window -t "$window" -v -p 50
tmux select-window -t "$window"
# Attach to session
tmux -2 attach-session -t "$session"
メモ:
- とりわけ、
/bin/sh
ここではBashは必要ありません。 - に慣れる二重引用符変数。必要なのかどうかにかかわらず、習慣的に引用することは、実際に変化をもたらすときに引用するのを忘れるよりもはるかに優れています。
- 使った変数名小文字。
- 私はそれを
tput
現在の端末のサイズを決定するために使用します。その後、new-session -d -x … -y …
適切な値を使用してください。しかし:- 初期テストではこれは不要に見えました。これらすべては、
-x
または-y
...なしで動作します。 - ...私の地域のマニュアルによると、これが必要ですが。
- それにもかかわらず、セッションがすでに存在している場合、そのサイズはすでに決定されており、
new-session -d -x … -y …
影響はありません。ウィンドウを接続してサイズを変更すると、レイアウトの割合が歪むことがあります。役に立ついくつかの tmux コマンドとオプション (resize-window
,window-size
, ) がありますが、default-size
以前の tmux には対応するエントリがないので、詳しくは説明しません。 tput
オペランドlines
であり、cols
POSIXでは必要ありません。バラよりこの回答交換。
- 初期テストではこれは不要に見えました。これらすべては、
- ウィンドウを作成できない場合、スクリプトは終了します。
- 各
split-window
ターゲットは右側のウィンドウをターゲットとしています。セッションが存在する場合、または誰かが同時に接続してウィンドウを変更する場合、現在のウィンドウはユーザーが想定しているウィンドウではありません。さらに強力になるには、各ウィンドウをsplit-window
そのウィンドウに明示的にターゲットとして指定する必要があります。多くのクライアントが同じtmuxサーバーと対話できる一般的な設定では、select-pane
beforesplit-window
(またはスクリプトのbefore)はresize-pane
実際には強力ではありません。一部の他のクライアント(ユーザーまたはスクリプト)は、他のウィンドウで2つのコマンドから選択できます。 - ウィンドウのサイズを変更しません。まず、適切な割合で作成します。私が使用するオプションは
-p
古いtmuxで動作します。文書新しい構文が似ており、split-window -l 20%
パーセンテージresize-pane
も使用できると教えてください。最新のtmuxがそれを理解できるかどうかわかりませんsplit-window -p
。ドキュメントにはこのオプションは記載されておらず、使用されなくなったりサポートされなくなったり、互換性を維持したりすることができます。これをテストできません(フィードバックまたは編集歓迎)。 split-window
新しいウィンドウ用のスペースを作成するために、縮小されるウィンドウの以前のサイズである使用可能なスペースの割合を使用します(少なくとも古いtmuxでは機能する方法です-p
)。だから22
こんな数字があるのです( 20/(20+70) ≒ 22 )。文書に従ってウィンドウサイズの割合を使用してくださいresize-pane
。-d
次のウィンドウに必要な条件に基づいて、現在のウィンドウに滞在するか、新しいウィンドウを現在のウィンドウにするために使用または使用しませんsplit-window
。- トークンに合ったウィンドウを指定/選択する必要があるときに
{top-right}
トークンを使用します。 - コマンドの実行には使用しません
send-keys
。一般的に言えばコマンドの実行には使用しないでくださいsend-keys
。tmux内で新しいシェルを生成する任意の(?)tmuxコマンドでもシェルコマンドを実行できます。これはサンプルスクリプトのecho "step 0"; bash
シェルコマンドです。実際のcommand()が完了したときにウィンドウが終了しないように、最後に含まれていますbash
。echo
代替はremain-on-exit
選択することです。シェルコマンド(watch
)は無制限に動作するため、そのようなトリックは必要ありません。send-keys
コマンドが実行されるシェルに影響を与え、目標がこのように準備されたシェルで対話的に作業する場合、スクリプトのようにシェルコマンドを実行するのが合理的です。たとえば、コマンドは変数を設定したり、スクリプトをインポートしたり、watch
それを中断してシェル履歴に保存したりできます。他の場合、「正しい」方法はtmuxまたは同様のコマンドを使用してsplit-window
コマンドを渡すことですrespawn-pane
。
追加情報:
cat /proc/cpuinfo | grep "MHz" | …
役に立たない使用ですcat
。より良い方法:</proc/cpuinfo grep "MHz" | … grep "MHz" /proc/cpuinfo | …