Tmux의 창 제목


88

내 로컬 컴퓨터에는 3 개의 node.js 인스턴스가 동시에 실행됩니다. 각각은 "서버"라는 tmux 창에 고유 한 창을 가지고 있습니다. 문제는 어떤 노드가 어떤 창에서 실행 중인지 파악하기가 쉽지 않다는 것입니다. 로그가 비슷하기 때문입니다.

내가 필요한 것은 모든 창에 대한 제목입니다. 내가 얻은대로, tmux 자체에는 기능이 없습니다. 창에 대한 제목이 아니라 창에 대한 제목 만 있습니다. 모든 node.js 인스턴스의 모든 창에서 별도의 tmux 세션을 시작하는 것은 과잉처럼 보입니다.

그렇다면 명령을 실행하고 출력을 지정된 상태 표시 줄로 래핑하는 작은 프로그램이 있습니까?

미리 감사드립니다


1
버전 2.3부터 tmux는 창 제목을 지원합니다. stackoverflow.com/a/37602055/266453
Dennis G

답변:


80

tmux창별 제목을 지원하지만 이러한 제목을 표시 할 창별 위치를 제공하지 않습니다.

ESC ]2;… ESC 이스케이프 시퀀스를 사용하여 분할 창의 제목을 설정할 수 있습니다 \(예 : tmux 맨 페이지 의 이름 및 제목 섹션 참조 ). 다음과 같이 쉘에서이를 수행 할 수 있습니다.

printf '\033]2;%s\033\\' 'title goes here'

각 창의 제목은 기본적으로 시스템의 호스트 이름입니다. 기본적으로 활성 창 제목이 오른쪽에 표시됩니다 TMUX의 상태 표시 줄 (세션 변수의 기본 전역 값 status-right이다 "#22T" %H:%M %d-%b-%y,하는 쇼 창의 제목, 시간 및 날짜의 22 자).

따라서 활성 창의 제목을 볼 수있는 경우 (즉, 비활성 창의 제목을보기 위해 창을 전환하려는 경우) 기본 기능을 사용할 수 있습니다. 각 창에 대한 기본 명령을 시작하기 전에 적절한 제목 설정 이스케이프 시퀀스를 보내십시오.


일부 창별 정보를 표시하기 위해 전용 회선이 반드시 필요한 경우 중첩 된 tmux 세션은 처음 생각하는 것만 큼 많은 (불필요한) "과잉"이 아닐 수 있습니다.

일반적으로 특정 터미널에 위반 상태 라인을 제공하려면 원래 터미널과 새 터미널 (하나 더 적은 라인이있는 터미널) 사이에있는 전체 터미널 (재) 에뮬레이터가 필요합니다. 이러한 (재) 에뮬레이션은 내부 터미널로 전송 된 제어 시퀀스를 변환하고 원래 터미널로 변환하는 데 필요합니다. 예를 들어 외부 터미널 맨 아래에 상태 표시 줄을 유지하려면 다음 명령을 사용하십시오.

마지막 줄로 이동합니다.

내부 터미널로 보내야합니다.

다음 줄로 이동합니다.

번역되어 외부 터미널로 전송 될 때. 마찬가지로 내부 터미널로 전송되는 LF는

커서가 마지막 줄 옆에있는 경우이 줄과 그 위의 모든 줄을 한 줄 위로 스크롤하여 마지막 줄에서 명확한 줄을 제공합니다 (마지막 줄의 상태 줄 보호). 그렇지 않으면 LF를 보냅니다.

외부 터미널에서.

tmuxscreen 과 같은 프로그램 은 이러한 터미널 재 에뮬레이터입니다. 물론 터미널 에뮬레이터를 둘러싼 많은 다른 기능이 있지만 안정적인 상태 표시 줄 을 제공하려면 터미널 에뮬레이션 코드의 큰 덩어리가 필요합니다 .


그러나 한 가벼운 솔루션이 있습니다.

  1. 프로그램 ( Node.js 인스턴스)이 실행중인 창과 제한된 터미널 상호 작용 (예 : 커서 위치 없음)이 있고
  2. 프로그램이 실행되는 동안 창 크기를 조정하지 않습니다.

많은 터미널 에뮬레이터와 마찬가지로 tmux 는 창에서 "스크롤링 영역 설정"터미널 제어 명령을 지원합니다. 이 명령을 사용하여 스크롤 영역을 터미널의 위쪽 (또는 아래쪽) N-1 줄로 제한하고 일종의 인스턴스 식별 텍스트를 스크롤하지 않는 줄에 쓸 수 있습니다.

출력을 생성하는 프로그램 (예 : Node.js 인스턴스)이 스크롤링이 특정 영역으로 제한되었음을 알지 못 하기 때문에 제한 (커서 이동 명령 허용, 크기 조정 없음)이 필요합니다 . 출력 생성 프로그램이 커서를 스크롤 영역 밖으로 이동하면 출력이 깨질 수 있습니다. 마찬가지로, 터미널 에뮬레이터는 터미널의 크기가 조정될 때 스크롤 영역을 자동으로 재설정 할 것입니다 (따라서 "비 스크롤 라인"은 아마도 스크롤링을 끝낼 것입니다).

tput적절한 제어 시퀀스를 생성하고 스크롤하지 않는 줄에 쓰고 커서를 스크롤 영역으로 이동 한 후 프로그램을 실행하는 데 사용하는 스크립트를 작성했습니다 .

#!/bin/sh

# usage: no_scroll_line top|bottom 'non-scrolling line content' command to run with args
#
#     Set up a non-scrolling line at the top (or the bottom) of the
#     terminal, write the given text into it, then (in the scrolling
#     region) run the given command with its arguments. When the
#     command has finished, pause with a prompt and reset the
#     scrolling region.

get_size() {
    set -- $(stty size)
    LINES=$1
    COLUMNS=$2
}
set_nonscrolling_line() {
    get_size
    case "$1" in
        t|to|top)
            non_scroll_line=0
            first_scrolling_line=1
            scroll_region="1 $(($LINES - 1))"
            ;;
        b|bo|bot|bott|botto|bottom)
            first_scrolling_line=0
            scroll_region="0 $(($LINES - 2))"
            non_scroll_line="$(($LINES - 1))"
            ;;
        *)
            echo 'error: first argument must be "top" or "bottom"'
            exit 1
            ;;
    esac
    clear
    tput csr $scroll_region
    tput cup "$non_scroll_line" 0
    printf %s "$2"
    tput cup "$first_scrolling_line" 0
}
reset_scrolling() {
    get_size
    clear
    tput csr 0 $(($LINES - 1))
}

# Set up the scrolling region and write into the non-scrolling line
set_nonscrolling_line "$1" "$2"
shift 2

# Run something that writes into the scolling region
"$@"
ec=$?

# Reset the scrolling region
printf %s 'Press ENTER to reset scrolling (will clear screen)'
read a_line
reset_scrolling

exit "$ec"

다음과 같이 사용할 수 있습니다.

tmux split-window '/path/to/no_scroll_line bottom "Node instance foo" node foo.js'
tmux split-window '/path/to/no_scroll_line bottom "Node instance bar" node bar.js'
tmux split-window '/path/to/no_scroll_line bottom "Node instance quux" node quux.js'

터미널이 해당 및 terminfo 기능을 지원하고 게시 하는 한 스크립트는 tmux 외부에서도 작동해야 합니다.csrcup


귀하의 스크립트는 내가 예상 한대로 정확하게 작동합니다. 유일한 질문 : "non_scroll_line"의 색상을 사용자 정의하려면 Google에서 무엇을해야합니까?
Andrey Lushnikov 2012 년

1
"terminfo 기능 전경 배경색"(즉, terminfo 맨 페이지에서 색상에 대해 읽어보기) 일 수 있습니다. 를 사용 tput하여 "line content"인수에 적절한 제어 시퀀스를 포함 할 수 있습니다 . 대부분의 터미널에서를 사용하여 선을 "자홍색 (5)에 청록색 (6) 및 녹색 (3)"으로 만들 수 no_scroll_line top "$(tput setaf 6; tput setab 5)Node: $(tput setaf 3)foo$(tput op)" node foo.js있습니다. setaf전경을 setab설정하고 배경을 op설정하며 터미널 기본 색상으로 재설정합니다. 색상 기능은 터미널 에뮬레이션에 따라 0–7, 0–15, 0–87 또는 0–255의 숫자를 사용합니다.
Chris Johnsen 2012 년

이제 pymux를 출시했습니다. 이 디스플레이는 제목 표시 줄 창 : github.com/jonathanslenders/pymux
조나단 Slenders

동작은 창 제목이 셸에서 실행되는 명령으로 설정되는 것 같습니다. 따라서 내부에서 하나의 수명이 긴 프로세스 (제목 설정 이스케이프 시퀀스를 출력하는 방법도 알고 있음)를 실행하지 않는 한 "고정"되지 않습니다.
Steven Lu

4
아래 답변을 더 살펴보십시오. stackoverflow.com/a/37602055/266453 tmux 버전 2.3부터는 창 테두리에서 제목을 지원합니다.
Dennis G

78

이 기능은 이 커밋 에서 tmux에 추가되었습니다 . 버전 2.2에는 없지만 2.3에있을 것 같습니다.

활성화하려면 :

tmux set -g pane-border-status top

또는 원하는 경우 :

tmux set -g pane-border-status bottom

사용자 지정 텍스트를 창 테두리 상태 줄로 설정하려면 다음 pane-border-format과 같이 사용할 수 있습니다 .

tmux set -g pane-border-format "#{pane_index} #{pane_current_command}"

1
창 번호와 기본 제목이 표시됩니다. 어떻게 생각을 바꾸나요?
adn

창 번호는 확실하지 않지만 xterm 창 제목처럼 이스케이프 시퀀스로 응답합니다. 예를 들어 bash를 사용하면 PS1 = '[\ e] 0; \ u @ \ h : \ w \ a] $'를 설정하여 "user @ host : working dir /"을
얻었습니다

내가 아는 한, 당신은 그 순서를 미리 설정했습니다. 그러나이를 변경하는 단축키 나 키 조합은 없습니다. 따라서 변경하려면 tmux외부 명령이 필요 tmux합니다. 권리? 아니면 업데이트 할 수있는 시퀀스가 ​​있습니까?
adn

예, 실행중인 셸에서 변수를 설정하면 다음 프롬프트가 표시 될 때 업데이트됩니다. 나에게는 tmux가 약간 스케치되어 있고 실제로 다른 창으로 전환 할 때만 업데이트하는 것 같습니다.
kevmitch

실제로 pane-border-format표시 할 창에 대한 사용자 지정 형식 문자열을 설정하는 데 사용할 수 있습니다 (일반 #{...}형식). 나는 이것을 포함하도록 귀하의 답변을 편집했습니다.
Dennis G

32

tmux 2.6할 수 있기 때문에 :

$ tmux select-pane -t {pane} -T {title}

# Examples:
$ tmux select-pane -T title1          # Change title of current pane
$ tmux select-pane -t 1 -T title2     # Change title of pane 1 in current window
$ tmux select-pane -t 2.1 -T title3   # Change title of pane 1 in window 2

다음을 사용하여 상태 표시 줄에서 창별 제목을 볼 수 있습니다.

$ tmux set pane-border-status bottom      # For current window
$ tmux set -g pane-border-status bottom   # For all windows

다음을 사용하여 상태 표시 줄 비활성화 :

$ tmux set pane-border-status off       # For current window
$ tmux set -g pane-border-status off    # For all windows

tmux가 당신 아래에서 제목을 바꾸는 것을 막을 방법이 있는지 알고 있습니까? 예를 들어 창 제목을 설정 한 다음 해당 창에서, 같은 작업을 수행 cd $HOME하면 제목이 값으로 변경됩니다 $HOME. (tmux 2.8에서보고 있습니다.)
pdoherty926

1
@ pdoherty926 아마도 당신은 이미 답을 얻었을 수도 있지만 set-window-option automatic-rename off.
noname

내가 가진 set-option -g allow-rename off내에서 .tmux.conf파일.
Eyal Levin

1
제안 해 주셔서 감사합니다. pane-border-format표시되는 내용을 제어하기 위해 사용자가 제공 한 변수 (이 기능에 대한 공식 이름이 있는지 확실하지 않음)를 사용하여 마무리했습니다 . 여기 에 예가 있습니다.
pdoherty926

14

tmux-ticket에 대한 창 상태 표시 줄에서 작업 중입니다. 내 개발 브랜치는 github에서 찾을 수 있습니다 : https://github.com/jonathanslenders/tmux

지금은 이미 작동중인 rename-pane "title" 명령이 추가되었습니다. 여전히 몇 가지 버그가 있으며 API가 개선 될 것입니다. 아이디어는 세션 상태 표시 줄과 같은 일부 형식을 가질 수있는 창별로 상태 표시 줄을 만드는 것입니다. 나머지 tmux와 마찬가지로 모든 것이 스크립팅 가능하고 사용자 정의 가능해야합니다. 완료되고 안정되면 공식 tmux에 포함될 것입니다.


거기에있는 동안 분할 창에서 창 제목이 기본 창 제목이되도록 만들 수 있습니까?
djsadinoff

이 분기는 tmux에서 병합되지 않았습니다. :하지만 창의 제목 표시 줄이있는, pymux 대신 만들어 github.com/jonathanslenders/pymux
조나단 Slenders

이 명령은 최신 빌드에서도 작동하지 않습니다 (커밋 a24260).
adn

14

tmux 버전 2.3을 사용하고 있는데 이전 버전에서는 테두리 스타일이 지원되지 않는다고 생각합니다. 이것은 나를 위해 일한 것입니다.

각 창에 대해 제목을 설정합니다.

printf '\033]2;My Pane Title\033\\'

그때:

tmux set -g pane-border-format "#{pane_index} #T"

9
최소한 tmux 2.6 이상에서는 tmux 내에서 창 제목을 변경할 수 있습니다 select-pane -T "my title". 키 바인딩을 설정할 수도 있으므로 제목 만 제공하면됩니다.bind-key T command-prompt -p "New title:" 'select-pane -T "%%"'
lucasem

3
@lucasem 아마도이 스레드를 따르지 않았지만 이것이 대답처럼 보입니다.
icicleking

@lucasem 100 % 확실하지는 않지만 귀하의 방법 (최신 버전의 tmux에 대해이 전체 스레드에서 가장 좋고 간단한 IMO)은 pane-border-status옵션이 무언가 ( top또는 bottom)로 설정된 경우에만 작동합니다 .
cjauvin

11

gif는 천 단어의 가치가 있습니다. ( 출처 )

tmux-xpanes 는 새로 추가 된 -t옵션을 통해 각 창에 대한 제목 표시를 지원하는 tmux 기반 터미널 분할기 입니다.


1
gif는 천 단어의 가치가 있지만 링크가 썩 으면 가치가 없습니다.
Fund Monica의 소송 19

7

예, 다음과 같은 명령이 tmux있습니다.. 세션에 이름을 지정하면 내부 상태 표시 줄에 표시됩니다.

TMUX=0 tmux new-session -s my-new-session

2
예, 답변 해 주셔서 감사합니다! 그러나 따라서 모든 창에서 맨 아래에있는 하나의 제목에 대해 새로운 tmux 세션을 시작해야합니다. 일종의 과잉입니다.
Andrey Lushnikov 2012 년

모르겠어요. 맞나요? 시도해 보셨습니까? 추가 세션에서 사용하는 추가 메모리는 얼마입니까?
event_jr

예, 오늘까지 중첩 된 tmux 세션을 사용했습니다. 나는 메모리 소비와 이와 같은 것들에 대해 잘 모르겠습니다. 순수하지 않기 때문에 개념 자체가 싫습니다.
Andrey Lushnikov 2012 년


0

TL; DR

다음 구성을 tmux 구성 파일에 추가하십시오 (제 경우에는 ~/.tmux.conf.local)

# dispaly pane_current_path as the pane title
set -g pane-border-status top
set -g pane-border-format "#{pane_index} #{pane_current_path}"

그런 다음 실행하십시오.

tmux source-file ~/.tmux.con

그것을 즐기십시오

https://stackoverflow.com/a/37602055/5121972 덕분에

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.