tmux에서 프로그래밍 방식으로 이 레이아웃을 어떻게 얻을 수 있나요?

tmux에서 프로그래밍 방식으로 이 레이아웃을 어떻게 얻을 수 있나요?

나는 최근에 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%" 열 전체가 두 개의 "50%" 창으로 분할됩니다. 분할을 다른 순서로 수행해야 합니다.

순서를 이해하는 한 가지 방법은 종이에 레이아웃을 그린 다음 가위로 잘라내는 것입니다.똑바로줄이다통과하다, 따라서 각 컷은 현재 블록을 두 개의 작은 블록으로 분할합니다. 아니면 초콜릿 바를 깨뜨린다고 상상해 보세요.

원하는 레이아웃에 대한 가능한 시나리오는 다음과 같습니다.

+---------------------+
|       1             |
|22222221             |
|   3   1             |
|   3   1#############|
|   3   1             |
|22222221             |
|       1             |
+---------------------+

이 숫자는 절단해야 하는 순서를 나타냅니다. 로 표시된 컷은 #오른쪽 열의 여러 컷을 나타내며 이전 1, 이전, 이후 또는 이후 2에 원하는 순서로 컷을 만들 수 있습니다 3. 이러한 #상처는 문제에 중요하지 않습니다. 중요한 것은 전후에 두 2컷(순서 상관없이)을 해야 한다는 것입니다.1앞으로 3. 스크립트는 3제작 없이 컷을 수행 2하므로 원하는 것을 얻을 수 있는 직접적인 방법이 없습니다.

split-window -f, 단일 창을 분할하는 대신 전체 창 높이 또는 전체 창 너비에 걸쳐 있는 새 창을 만듭니다. 어느 정도 유연성을 제공하고 창을 다른 순서로 생성할 수 있지만 이미 구현된 레이아웃에서 원하는 레이아웃을 얻는 데 도움이 되지 않으며 더 많은 레이아웃도 가능하지 않습니다.


비교해 보면 이것은 실제로 불가능한 레이아웃이라고 생각합니다.

+---------------------+
|       #             |
|       #             |
|       ##############|
|       |       |     |
|       |       |     |
|---------------|     |
|               |     |
+---------------------+

실제로 가위로 자를 수 있지만 tmux로는 자를 수 없습니다. 왜냐하면 적어도 가위를 사용한 첫 번째 패스에서는 두 개의 별도 시트를 만들기 위해 구부려야 하기 때문입니다. 첫 번째 컷 예시는 #사람의 모습으로 그려졌습니다. 이것을 "통과"하지 않는 두 컷으로 해석할 수 있으므로 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이며 colsPOSIX에서는 필요하지 않습니다. 바라보다이 답변교체.
  • 창을 만들 수 없으면 스크립트가 종료됩니다.
  • split-window대상은 오른쪽 창을 대상으로 합니다. 세션이 존재하거나 누군가가 동시에 연결하여 창을 변경하는 경우 현재 창은 사용자가 가정하는 창이 아닙니다. 더욱 강력해지려면 각 창을 split-window해당 창에 명시적으로 대상으로 지정해야 합니다. 많은 클라이언트가 동일한 tmux 서버와 상호 작용할 수 있는 일반 설정에서는 select-panebefore split-window(또는 스크립트의 before) 가 resize-pane실제로 강력하지 않습니다. 일부 다른 클라이언트(사용자 또는 스크립트)는 다른 창에서 두 명령 중에서 선택할 수 있습니다.
  • 창 크기를 조정하지 않습니다. 먼저 적절한 비율로 만듭니다. 내가 사용하는 옵션은 -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  | …
    

답변2

왼쪽을 먼저 만든 다음 오른쪽을 만들고 창을 원하는 비율로 매번 분할합니다.

tmux new -d
tmux splitw -dh
tmux splitw -p90
tmux splitw -dp22 # 20/90
tmux splitw -h
tmux selectp -t'{right}'
tmux splitw -p80
tmux splitw -p56 # (15+15+15)/80
tmux splitw -p50
tmux selectp -t'{top-left}'
tmux a

분할 창을 한 번에 하나씩 추가하고 결과를 확인하여 현재 창이 어떤 창인지, 다음 창을 어떻게 분할해야 하는지 확인합니다.

관련 정보