rinominare il nome della finestra di tmux in prompt_command, ps1 o nome host ssh remoto?


25

Mi piacerebbe poter avere il titolo della mia finestra di tmux rinominato automaticamente in prompt_command, ps1 o solo il nome host di una macchina a cui mi riferisco ssh. avere 9 finestre aperte etichettate "ssh" è davvero inutile. Facendo funzionare sysadmin, apro nuove schermate e faccio di tutto per rinominarle manualmente.

Una cosa che ho notato è l' tmuxaggiornamento del xtermtitolo della finestra, quindi mi sembra che debba saperlo.

Qualsiasi aiuto? Sarei anche disposto a tornare indietro screense potessi ottenere questa funzione.

Risposte:


15

Non sono a conoscenza di alcun modo per farlo guardare PS1direttamente al tuo .

Tuttavia, tmuxcomprende gli stessi comandi per impostare il nome della finestra screen.

Quindi puoi definire una funzione come questa nel tuo ~/.bashrco ~/.zshrc:

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

e poi chiama settitleda qualsiasi luogo.

Ad esempio, potresti includerlo nella tua PS1variabile, ad es

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

o tramite PROMPT_COMMAND:

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

Ora capisco che hai in tmuxesecuzione sul desktop e vuoi che i sshcomandi abbiano il nome host piuttosto che ssh, è molto più facile.

Dato che hai aggiunto settitleal tuo locale ~/.bashrc, tutto ciò che vuoi fare è aggiungere anche questo:

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

Sostituisci bash con zsh o qualcos'altro più appropriato, se necessario.


Questo in realtà non nomina il titolo della finestra con il nome host del box remoto senza avere l'impostazione .bashrc sul box remoto. Grazie anche se ho imparato un po 'di slick.
user68782

Se tutto ciò che vuoi è il nome host sul tuo lato locale, è molto più semplice. Aspetta un secondo ...
Mikel

brillante! grazie. Ci dispiace che la mia incapacità di spiegare la mia richiesta abbia portato a due domande. grazie ancora!
user68782

Quando tmux cambia il titolo della finestra per capriccio, questo può essere rapidamente sovrascritto da normali modifiche al titolo della finestra da tmux.
UtahJarhead,

Grazie! Ho usato PROMPT_COMMAND='settitle $HOSTNAME:$PWD'- dal momento che con il codice di @ Mikel non ho ricevuto nessun nome host e un -bash: : No such file or directoryerrore prima di ogni prompt dei comandi. Mi sembra che $()farebbe provare a bash a eseguire qualunque cosa settitle ritorni . (Sto eseguendo bash su Linux.)
Tuomassalo,

35

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

Questo è il modo corretto di impostare i titoli tmux in una finestra. La variabile $ TMUX_PANE è impostata da tmux e viene utilizzata per differenziare i diversi riquadri.


2
Dato che è la finestra attiva, non credo -t${TMUX_PANE}sia necessario (almeno non era per me).
Christopher,

8
@Christopher Se stai eseguendo, diciamo, sleep 3e cambi finestra, il prompt darebbe altrimenti il ​​comando alla finestra sbagliata al termine della sospensione . (Questo è il motivo per cui sono venuto qui, +1).
quornian

16

Solo per le persone che sono venute qui cercando come modificare il titolo di una sessione di tmux:

Ctrl+ B,$

Questo ti darà un prompt, dove puoi rinominare la sessione attiva.

Per cambiare la finestra attiva usa invece komma:

Ctrl+ B,,

vedere: Come posso rinominare una sessione in tmux?


8

Combinando le risposte di Mikel e UtahJarhead, ho usato quanto segue .zshrc soluzioni per risolvere questo problema:

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

Ho la ridenominazione automatica delle finestre abilitata per impostazione predefinita e non riesco a trovare un modo per riattivarla dopo essere uscito dall'host remoto. Pertanto, esco completamente dalla finestra, non un problema per il mio flusso di lavoro. Se preferisci rinominarlo in, ad esempio "bash", puoi sostituire la exitriga con tmux rename-window "bash".


1
Sto usando tmux rename-window hostname -sdopo il comando ssh "@ $", sostanzialmente "reimposta" il titolo sulla mia macchina "gateway".
andrei,

7

Invece di exito tmux rename-window "bash"puoi usare

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
}

Ciò riattiva la normale funzione che rinomina automaticamente la finestra per i comandi successivi.

Il ifblocco impedisce di (senza di esso) rinominare tmuxla finestra corrente dai sshcomandi utilizzati su altre shell (fuori tmux).


Ho optato per un prodotto if env | grep -q "TMUX_PANE"; thenpiuttosto che ps -p...roba, ma lo stesso principio.
atomici

1

So che è stato risposto molto tempo fa, ma ho pensato di aggiungere ciò che ho cercato e trovato (in base alla risposta accettata). Ho aggiunto questo a / etc / bashrc di tutti i miei server (facile da fare con tessuto, burattino, ecc.)

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

E imposta automaticamente il nome della finestra in screen o tmux.


usiamo dns interno, quindi hostname -srimuoviamo le cose extra del dominio, in modo che server1.internal.local si presenti come solo server1
Brian

1

Un'altra soluzione sarebbe quella di rinominare la finestra attiva con il nome precedente, dopo la sessione 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
}

0

Questo funziona per in tmux 2.1e con zsh localmente e sui server:

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
}

Ho dovuto disabilitare manualmente l'opzione allow-rename prima di cambiare il nome di Windows - altrimenti è stato cambiato nel percorso corrente sulla maggior parte dei miei server (usando anche zsh lì). La cosa buona è: se si riattiva l'opzione allow-rename, funziona immediatamente.


0

Aggiungi questo a .profileo.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
}

0

Vorrei notare in tutti questi esempi con:

command ssh "$@"

Potresti voler prendere il codice di uscita ed uscire dalla funzione con esso, altrimenti cose come:

ssh server false

Restituirà 0.

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

Uscirà da ssh con il codice di ritorno di ssh.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.