zmienić nazwę okna tmux na komendę, ps1 lub nazwę zdalnego hosta ssh?

25

Chciałbym mieć możliwość automatycznego zmieniania nazwy mojego okna tmux na prompt_command, ps1 lub po prostu nazwę hosta komputera, sshdo którego mam . otwarcie 9 okien z napisem „ssh” jest naprawdę bezużyteczne. Robiąc sysadmin, otwieram nowe ekrany i ssh dookoła, aby ręcznie zmienić ich nazwy.

Jedną z rzeczy, które zauważyłem, jest tmuxaktualizacja xtermtytułu okna, więc czuję, że powinien wiedzieć.

Jakaś pomoc? Byłbym nawet skłonny wrócić, screengdybym mógł uzyskać tę funkcję.

użytkownik68782
źródło

Odpowiedzi:

15

Nie znam żadnego sposobu, aby sprawić, że spojrzy na ciebie PS1bezpośrednio.

Jednak tmuxrozumie te same polecenia, aby ustawić nazwę okna tak jak screenrobi.

Możesz więc zdefiniować taką funkcję w swoim ~/.bashrclub ~/.zshrc:

settitle() {
    printf "\033k$1\033\\"
}

a następnie zadzwonić settitlez dowolnego miejsca.

Na przykład możesz uwzględnić go w PS1zmiennej, np

PS1='$HOST:$PWD$(settitle $HOST:$PWD)$ '

lub przez PROMPT_COMMAND:

PROMPT_COMMAND='$(settitle $HOST:$PWD)'
# and don't change PS1

Teraz rozumiem, że tmuxdziałasz na pulpicie i chcesz, aby sshpolecenia miały nazwę hosta, a sshto znacznie łatwiejsze.

Biorąc pod uwagę, że dodałeś settitledo swojego lokalnego ~/.bashrc, wszystko, co chcesz zrobić, to również dodać:

ssh() {
    settitle "$*"
    command ssh "$@"
    settitle "bash"
}

W razie potrzeby zamień bash na zsh lub na bardziej odpowiednie.

Mikel
źródło
To naprawdę nie nazywa tytułu okna nazwą hosta zdalnego urządzenia bez konieczności instalowania .bashrc na zdalnym urządzeniu. Dziękuję, choć nauczyłem się czegoś zręcznego.
user68782,
If all you want is the hostname on your local side, that's much easier. Hang on a sec...
Mikel
znakomity! Dziękuję Ci. Niestety, moja niezdolność do wyjaśnienia mojej prośby spowodowała dwa pytania. jeszcze raz dzięki!
user68782,
Gdy tmux zmienia tytuł okna kaprysem, można to bardzo szybko zastąpić normalnymi zmianami tytułu okna przez tmux.
UtahJarhead,
Dzięki! Użyłem PROMPT_COMMAND='settitle $HOSTNAME:$PWD'- ponieważ z kodem @ Mikela nie otrzymałem nazwy hosta i -bash: : No such file or directorybłędu przed każdym wierszem polecenia. Wydaje mi się, $()że bash spróbuje wykonać wszystko, co settitle zwraca . (Pracuję na Linuksie).
tuomassalo
35

tmux rename-window -t${TMUX_PANE} "Title Text"

Jest to właściwy sposób ustawiania tytułów tmux w oknie. Zmienna $ TMUX_PANE jest ustawiana przez tmux i służy do rozróżniania różnych paneli.

Utah Jarhead
źródło
2
Ponieważ jest to aktywne okno, nie sądzę, aby było -t${TMUX_PANE}to konieczne (przynajmniej nie było to dla mnie).
Christopher
8
@Christopher Jeśli uruchamiasz, powiedzmy sleep 3i przełączasz okna, w przeciwnym razie monit wyda polecenie w niewłaściwym oknie po zakończeniu snu. (To jest powód, dla którego tu przyszedłem, +1).
quornian
16

Tylko dla osób, które przyszły tutaj, szukając sposobu zmiany tytułu sesji tmux:

Ctrl+ B,$

Spowoduje to wyświetlenie monitu o zmianę nazwy aktywnej sesji.

Aby zmienić aktywne okno, użyj komendy zamiast:

Ctrl+ B,,

zobacz: Jak zmienić nazwę sesji w tmux?

rubo77
źródło
8

Łącząc odpowiedzi Mikela i UtahJarhead, wykorzystałem następujące w .zshrccelu rozwiązania tego problemu:

ssh() {
    tmux rename-window "$*"
    command ssh "$@"
    exit
}

Mam domyślnie włączoną automatyczną zmianę nazwy okna i nie mogę znaleźć sposobu na jej ponowne włączenie po wyjściu ze zdalnego hosta. Dlatego po prostu wychodzę z okna całkowicie - nie stanowi to problemu w moim przepływie pracy. Jeśli wolisz zmienić jego nazwę na powiedzmy „bash”, możesz zastąpić exitlinię tmux rename-window "bash".

Krzysztof
źródło
1
Korzystam z okna zmiany nazwy tmux hostname -spo komendzie ssh „@ $”, to po prostu „resetuje” tytuł do mojej maszyny „gateway”.
andrei
7

Zamiast exitlub tmux rename-window "bash"możesz użyć

ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
            tmux rename-window "$*"
            command ssh "$@"
            tmux set-window-option automatic-rename "on" 1>/dev/null
    else
            command ssh "$@"
    fi
}

To ponownie aktywuje normalną funkcję, która automatycznie zmienia nazwę okna na kolejne polecenia.

W ifzapobiega blokowe z (bez niego) zmiany nazwy tmuxbieżące okno z sshpoleceniami wykorzystywane w innych powłok (na tmux).

tarczewski
źródło
Poszedłem dla if env | grep -q "TMUX_PANE"; thenzamiast ps -p...rzeczy, ale samej zasadzie.
atomów
1

Wiem, że odpowiedziano na to dawno temu, ale pomyślałem, że dodam to, co majstrowałem i znalazłem (na podstawie zaakceptowanej odpowiedzi) .. Dodałem to do / etc / bashrc wszystkich moich serwerów (łatwe do zrobić z tkaniną, marionetką itp.)

settitle() {
    printf "\033k$1\033\\"
}
bash_prompt_command() {
    settitle "`hostname -s`:$PWD"
}
PROMPT_COMMAND=bash_prompt_command

I ustawia nazwę okna automatycznie na ekranie lub tmux.

Brian
źródło
używamy wewnętrznych dns, więc hostname -susuwamy dodatkowe rzeczy z domeny, dzięki czemu server1.internal.local pojawia się jako server1
Brian
1

Innym rozwiązaniem może być zmiana nazwy aktywnego okna na jego poprzednią nazwę po sesji ssh:

ssh() {

local code=0
local ancien

ancien=$(tmux display-message -p '#W')

if [ $TERM = tmux -o $TERM = tmux-256color ]; then

    tmux rename-window "$*"

    command ssh "$@"

    code=$?
else
    command ssh "$@"

    code=$?
fi

tmux rename-window $ancien

return $code
}
Chimay
źródło
0

Działa to dla tmux 2.1i zsh lokalnie i na serwerach:

ssh() {
    tmux set-option allow-rename off 1>/dev/null
    tmux rename-window "ssh/$*"
    command ssh "$@"
    tmux set-option allow-rename on 1>/dev/null
}

Musiałem ręcznie wyłączyć opcję zezwól na zmianę nazwy przed zmianą nazwy systemu Windows - w przeciwnym razie została zmieniona na bieżącą ścieżkę na większości moich serwerów (także tam, gdzie używasz zsh). Dobrą rzeczą jest: jeśli ponownie włączysz opcję zezwól na zmianę nazwy, działa ona natychmiast.

FSchndr
źródło
0

Dodaj to do .profilelub.bashrc

# Change window name for `tmux`
ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
        #tmux rename-window "$(echo $* | cut -d . -f 1)"
        tmux rename-window "$(echo $* | cut -d @ -f 2)"
        command ssh "$@"
        tmux set-window-option automatic-rename "on" 1>/dev/null
    else
        command ssh "$@"
    fi
}
użytkownik536642
źródło
0

We wszystkich tych przykładach odnotowałbym:

command ssh "$@"

Możesz pobrać kod wyjścia i wyjść z niego za pomocą funkcji, w przeciwnym razie:

ssh server false

Zwróci 0.

command ssh"$@"
_exitcode=$?
#other code
exit $_exitcode

Wyjdzie z ssh z kodem powrotu ssh.

Josefwells
źródło