tmux의 창 너비를 고정시키는 방법은 무엇입니까?


4

창을 두 개의 창으로 나누면 오른쪽 창에는 너비가 20 셀이 있습니다. 그러나 외부 터미널 에뮬레이터의 크기를 조정하면 창의 너비가 변경됩니다.

이 문제를 해결할 방법이 있습니까? 20 셀에 맞게 형식화 된 정보를 표시하고 싶기 때문에

답변:


4

내가 알 수있는 한, 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새로 크기 조정 창에서 작업을 계속할 수 있었지만, 당신에게 도움이 될 새로운 옵션을 고려했습니다 ...

원래 게시 이후이 아이디어를 다시 생각했으며 실행중인 프로그램에 쉘 명령을 보낼 수있는 루프가 있으면 합리적으로 자동화 할 수 있다고 생각합니다. 기본적으로 창을 분할하여 프로그램을 실행할 수 있기 때문입니다. 여기 내가 의미하는 바의 예가 있습니다. 다음 코드

  1. 사용자가 실행 runCodeSplit.sh, 어떤
  2. 새 분할 창을 최종 분할 창의 오른쪽에 가로 (20c 너비)로 분할하여 실행 test.sh
  3. 루프 입력
  4. 현재 창 크기를 확인하고 크기 조정을 시도합니다
  5. 10 초 동안 잠자기 (하지만 원하는대로 수행하도록 변경할 수 있음)
  6. 3 & 4를 10 회 반복 한 다음 종료

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 창마다 한 번만 실행해야합니다. 문제는 그것을 실행할 때마다 서로 옆에 모여 공간을 놓고 경쟁하게됩니다 (하나는 확장하기 위해 다른 하나는 축소하고 그 반대도 마찬가지입니다). 이 문제를 해결할 수는 있지만 알아 내기 위해 귀하에게 맡깁니다.


자세한 답변에 감사드립니다. PS 또는 프롬프트 명령을 사용하여 창의 크기를 조정한다고 말 했으므로 해당 창으로 전환하고 Enter 키를 눌러 크기를 조정해야합니까? 터미널 변경 이벤트를 잡을 방법이 있습니까? 자동 크기 조정이 가능합니다. tmux 자체가 터미널 크기 변경에 응답 할 수 있기 때문입니다.
haohaolee

이전 답변이 도움이되지 않아 죄송합니다. 나는 그것을 다시 생각하고 크기 조정 프로세스를 자동화 할 수있는 새로운 섹션을 추가했습니다. 참고로 이것은 나에게도 유용합니다 :)
scicalculator

답변으로 표시하십시오. btw, 마침내 나는이 접근법을 따르지 않았다. 왜냐하면 내가 사용하는 쉘-zsh가 크기가 변경 될 때 다시 전화 할 수있는 능력을 가지고 있기 때문에 시간에 tmux 크기 조정을 사용할 수 있기 때문이다.
haohaolee

참고 : 현재 창 번호를 찾을 수 있습니다tmux display-message -p '#P'
피터 V. Mørch

2

나는 누군가를 해치지 않기 때문에 내 다양성을 게시 할 것이고 아마도 누군가에게 더 잘 맞을 것입니다.

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

감사. 내가있는 상황은 당신과 정확히 동일합니다. 나는 irssi와 tmux도 사용합니다. 그러나이 스크립트를 누가 호출해야합니까? 창 1에서 이것을 호출해야합니까?
haohaolee

그것은 TMUX 세션 이름 등 개인을 포함하기 때문에 당신은 어디에서 호출 할 수 있습니다, 내가 대신 irssi 플러그인으로 위를 다시 썼다 - "nicklist.pl에 대한 TMUX 창 크기 자동 업데이트"섹션을 참조하십시오에서 510x.se/notes/ posts / Install_and_setup_BitlBee . 나는 적어도 몇 주 동안 플러그인을 사용 해 왔으며 여기서 훌륭하게 작동합니다.
Daniel Andersson

매우 감사합니다. 평판이 충분하면 답을 투표하겠습니다
haohaolee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.