답변:
내가 알 수있는 한, tmux에는 너비를 최소값으로 고정하는 설정이 없으며 최대 값으로 만 설정되어 있습니다. 터미널 윈도우의 크기를 tmux의 최소값보다 작게 조정할 수 있고 tmux가이를 처리하는 적절한 방법을 가지고 있지 않기 때문입니다.
즉, 다른 tmux 창을 연 경우 PS1='$(resizePane $id)other-stuff'
tmux 내에서 다른 창을 사용할 때 20c 너비로 유지하려는 정보 창 크기를 지속적으로 조정하기 위해 PS1 ( ) 또는 PROMPT_COMMAND에 작은 스크립트를 추가 할 수 있습니다 . 본질적으로 1) 프로그램을 열 수 있습니다 .2) 터미널 크기를 조정합니다 .3) 다른 창으로 이동합니다 .4) 유형 Enter
과 책임, 창 크기가 조정됩니다.
맨 페이지를 봐야합니다.
resize-pane [-DLRU] [-t target-pane] [adjustment]
원하는 분할 창에있는 경우 왼쪽 -L 또는 오른쪽 -R의 너비를 20에 도달하는 데 필요한 x 문자만큼 축소하는 것이 전부입니다. 기본적으로 분할 창이 벽보다 더 높은 경우 창보다 축소하려면 방향을 사용하고 확대에는 반대 방향을 사용하십시오. 내 창이 오른쪽 벽 옆에 있으면 -R을 사용하여 너비를 줄이고 -L을 사용하여 확대하십시오.
올바른 양의 문자를 얻으려면 입력하는 경우 분할 창 ID와 함께 찾을 수있는 분할 창의 현재 너비를 알아야합니다.
tmux list-panes
아직 Prefix+q
또는 입력 을 제외한 현재 창 번호를 알려주는 방법을 아직 확실하지 않습니다.
tmux display-panes
현재 창에있는 모든 창의 id 번호를 알려줍니다. 오른쪽 벽에 있다고 가정하고 id # ($ id)를 알고 있다면 다음과 같이 창 크기를 20 자로 조정할 수 있습니다.
paneWidths=$(tmux list-panes | awk '{print $2}' | cut -c 2- | cut -f 1 -d'x')
currentWidth=$(echo $paneWidths | sed $id'q;d')
resizeNum=$(expr $currentWidth - 20)
tmux resize-pane -R -t $id $resizeNum
resizeNum은 음수 일 수 없습니다. 음수이면 다른 쪽을 사용하여 resizeNum의 절대 값으로 크기를 조정하십시오 (자동화 할 수는 있지만 그 결과를 알려 드리겠습니다). 또한 이것을 프로그램 코드에 통합하면 "-t $ id"부분을 무시할 수 있지만 프로그램 내에서 $ id를 자동으로 찾는 방법을 모르겠습니다.
를 살펴 보는 데 유용 할 수도 있습니다 tmux setw main-pane-width
tmux setw other-pane-width
. 새 타일 형식을 다시로드하면 특정 창 너비가 설정됩니다. 형식을 순환하려면Prefix+space
이것이 도움이되기를 바랍니다!
--- 자동화에 대한 추가 정보를 추가하도록 편집 ---
나의 이전 생각은, 당신이 새로운 창으로 가서 다른 창 안에서 PS1="$(resizePane $id)${PS1}"
쳐서 ENTER
새로 크기 조정 창에서 작업을 계속할 수 있었지만, 당신에게 도움이 될 새로운 옵션을 고려했습니다 ...
원래 게시 이후이 아이디어를 다시 생각했으며 실행중인 프로그램에 쉘 명령을 보낼 수있는 루프가 있으면 합리적으로 자동화 할 수 있다고 생각합니다. 기본적으로 창을 분할하여 프로그램을 실행할 수 있기 때문입니다. 여기 내가 의미하는 바의 예가 있습니다. 다음 코드
runCodeSplit.sh
, 어떤test.sh
runCodeSplit.sh :
#!/bin/bash
# runCodeSplit.sh
paneID=$(tmux list-panes | wc -l)
echo "pane: $paneID"
echo $(expr $paneID - 1)
# now, open a new pane and run the func
tmux split-window -h -l 20 -t $(expr $paneID - 1 ) "~/test.sh $paneID"
test.sh :
#!/bin/bash
# test.sh
if [[ $# -lt 1 ]] ; then
echo "please provide the pane-number"
exit
fi
paneID=$1
i=0
while [[ i -lt 10 ]] ; do
# find the current width and resize it at every loop
width=$(tmux list-panes | awk '{print $2}' | cut -c 2- | cut -f 1 -d'x' | sed $(expr $paneID + 1)'q;d')
resizeNum=$(expr $width - 20)
echo "$paneID : w $width r $resizeNum"
if [[ $resizeNum -gt 0 ]] ; then
tmux resize-pane -R -t $paneID $resizeNum
elif [[ $resizeNum -lt 0 ]] ; then
tmux resize-pane -L -t $paneID $(expr 0 - $resizeNum)
fi
#now, we can do stuff ...
let i++
echo "i= $i / 10"
sleep 10
done
read -p "Press any key to close this pane ... " -n1 -s
참고 : 불행히도, 위에서 구현 한 방법은 실제로 tmux 창마다 한 번만 실행해야합니다. 문제는 그것을 실행할 때마다 서로 옆에 모여 공간을 놓고 경쟁하게됩니다 (하나는 확장하기 위해 다른 하나는 축소하고 그 반대도 마찬가지입니다). 이 문제를 해결할 수는 있지만 알아 내기 위해 귀하에게 맡깁니다.
tmux display-message -p '#P'
나는 누군가를 해치지 않기 때문에 내 다양성을 게시 할 것이고 아마도 누군가에게 더 잘 맞을 것입니다.
nicklist.pl
스크립트 에서 출력을 읽는 tmux의 irssi 세션에서 창 크기를 조정하는 데 사용합니다 . 다른 터미널에 연결할 때 창 크기가 자주 조정되며 FIFO가 올바르게 작동하려면 너비가> 20 열이어야합니다 (화면 공간을 훔칠 필요가 없습니다).
복잡한 CURRENT_PANE_WIDTH
계산을 무시하고 원하는 경우 grep + sed를 사용하십시오. 현재는 대부분 스크립트를 완전히 쉘로 유지하는 실험이었습니다 (물론 tmux 호출 제외). 아마도 가장 빠를 것입니다. 스크립트가 자주 실행되는 자동화에 흥미로울 수 있습니다 (현재는 특정 호출로 실행합니다).
#!/bin/sh
TMUX="/usr/bin/tmux"
TMUX_SESSION="irssi"
TMUX_WINDOW="0"
TMUX_WINDOW_PANE="1"
DESIRED_PANE_WIDTH="20"
error()
{
printf '%s: error: %s\n' "${0##*/}" "${1}" 1>&2
exit ${2}
}
# Find with grep and sed. More readable and easier to modify.
#CURRENT_PANE_WIDTH="$(${TMUX} list-panes -t "${TMUX_SESSION}:0 | grep "^${TMUX_WINDOW_PANE}: " | sed 's/^'"${TMUX_WINDOW_PANE}"': \[\([^x]\+\).*/\1/')"
# Find with shell expansion. Because it can be done!
CURRENT_PANE_WIDTH=$(${TMUX} list-panes -t "${TMUX_SESSION}:${TMUX_WINDOW}" |\
while read line; do
PANE_MATCH="${line#${TMUX_WINDOW_PANE}:\ \[}"
if [ "${line}" != "${PANE_MATCH}" ]; then
CURRENT_PANE_WIDTH="${PANE_MATCH%%x*}"
printf "${PANE_MATCH%%x*}"
break;
fi
done)
if [ -z "${CURRENT_PANE_WIDTH}" ]; then
error 'no matching pane found.' 1
fi
if ! [ "${CURRENT_PANE_WIDTH}" -eq "${CURRENT_PANE_WIDTH}" ]; then
error 'could not get integer width.' 1
elif ! [ "${CURRENT_PANE_WIDTH}" -eq "${DESIRED_PANE_WIDTH}" ]; then
RESIZE_NUMBER=$((${CURRENT_PANE_WIDTH} - ${DESIRED_PANE_WIDTH}))
if [ ${RESIZE_NUMBER} -ge 0 ]; then
DIRECTION="R"
else
DIRECTION="L"
RESIZE_NUMBER=$((-${RESIZE_NUMBER}))
fi
${TMUX} resize-pane -t "${TMUX_SESSION}:${TMUX_WINDOW}" -${DIRECTION} ${RESIZE_NUMBER}
fi