renommer le nom de la fenêtre tmux en prompt_command, ps1 ou nom d'hôte ssh distant?


25

Je serais ravi de pouvoir renommer automatiquement le titre de ma fenêtre tmux en prompt_command, ps1 ou tout simplement le nom d'hôte d'une machine sur laquelle je vais ssh. avoir 9 fenêtres ouvertes étiquetées "ssh" est vraiment inutile. Faire le travail sysadmin j'ouvre de nouveaux écrans et ssh autour de beaucoup pour les renommer manuellement.

Une chose que j'ai remarquée est la tmuxmise à jour du xtermtitre de la fenêtre, donc j'ai l'impression qu'il faut le savoir.

De l'aide? Je serais même prêt à revenir screensi je pouvais obtenir cette fonctionnalité.

Réponses:


15

Je ne connais aucun moyen de le faire regarder PS1directement.

Cependant, tmuxcomprend les mêmes commandes pour définir le nom de la fenêtre screen.

Vous pouvez donc définir une fonction comme celle-ci dans votre ~/.bashrcou ~/.zshrc:

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

puis appelez settitlede n'importe où.

Par exemple, vous pouvez l'inclure dans votre PS1variable, par exemple

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

ou via PROMPT_COMMAND:

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

Je comprends maintenant que vous avez tmuxexécuté sur votre bureau, et vous voulez que les sshcommandes aient le nom d'hôte plutôt que ssh, c'est beaucoup plus facile.

Étant donné que vous avez ajouté settitleà votre section locale ~/.bashrc, tout ce que vous voulez faire, c'est l'ajouter aussi:

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

Remplacez bash par zsh, ou autre chose plus approprié si nécessaire.


Cela ne nomme vraiment pas le titre de la fenêtre au nom d'hôte de la boîte distante sans avoir la configuration .bashrc sur la boîte distante. Merci, bien que j'aie appris une certaine nappe.
user68782

Si tout ce que vous voulez, c'est le nom d'hôte de votre côté local, c'est beaucoup plus facile. Attendez une seconde ...
Mikel

brillant! Je vous remercie. Désolé, mon incapacité à expliquer ma demande a entraîné deux questions. Merci encore!
user68782

Comme tmux change son titre de fenêtre sur un coup de tête, cela peut très rapidement être écrasé par des modifications normales du titre de la fenêtre par tmux.
UtahJarhead

Merci! J'ai utilisé PROMPT_COMMAND='settitle $HOSTNAME:$PWD'- car avec le code de @ Mikel, je n'ai reçu aucun nom d'hôte et une -bash: : No such file or directoryerreur avant chaque invite de commande. Il me semble que le $()ferait essayer à bash d'exécuter n'importe quel settitle retour . (Je cours bash sur linux.)
tuomassalo

35

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

C'est la bonne façon de définir les titres tmux dans une fenêtre. La variable $ TMUX_PANE est définie par tmux et est utilisée pour différencier les différents volets.


2
Comme c'est la fenêtre active, je ne pense pas que ce -t${TMUX_PANE}soit nécessaire (du moins ce n'était pas pour moi).
Christopher

8
@Christopher Si vous exécutez, disons, sleep 3et changez de fenêtre, l'invite émettrait sinon la commande dans la mauvaise fenêtre une fois le sommeil terminé. (C'est la raison pour laquelle je suis venu ici, +1).
quornian le

16

Juste pour les gens qui sont venus ici en cherchant comment changer le titre d'une session tmux:

Ctrl+ B,$

Cela vous donnera une invite, où vous pourrez renommer la session active.

Pour modifier la fenêtre active, utilisez plutôt komma:

Ctrl+ B,,

voir: Comment renommer une session dans tmux?


8

En combinant les réponses de Mikel et d'UtahJarhead, j'ai utilisé ce qui suit .zshrcpour résoudre ce problème:

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

Le changement de nom de fenêtre automatique est activé par défaut et je ne trouve pas de moyen de le réactiver après avoir quitté l'hôte distant. Ainsi, je quitte tout simplement la fenêtre - pas un problème pour mon flux de travail. Si vous préférez le renommer par exemple en «bash», vous pouvez remplacer la exitligne par tmux rename-window "bash".


1
J'utilise tmux rename-window hostname -saprès la commande ssh "@ $", il "réinitialise" essentiellement le titre sur ma machine "passerelle".
andrei

7

Au lieu de exitou tmux rename-window "bash"vous pouvez utiliser

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
}

Cela réactive la fonction normale qui renomme automatiquement la fenêtre pour les commandes suivantes.

Le ifbloc empêche de (sans lui) renommer tmuxla fenêtre courante des sshcommandes utilisées sur d'autres shells (hors tmux).


J'ai opté pour un if env | grep -q "TMUX_PANE"; thenau lieu de l' ps -p...étoffe, mais le même principe.
atomicules

1

Je sais que cela a été répondu il y a longtemps, mais je pensais que j'ajouterais ce que j'ai tripoté et trouvé (sur la base de la réponse acceptée) .. J'ai ajouté cela au / etc / bashrc de tous mes serveurs (facile à faire avec du tissu, des marionnettes, etc.)

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

Et il définit automatiquement le nom de la fenêtre dans screen ou tmux.


nous utilisons des DNS internes, donc nous hostname -ssupprimons les éléments de domaine supplémentaires, de sorte que server1.internal.local apparaisse comme juste server1
Brian

1

Une autre solution serait de renommer la fenêtre active en son nom précédent, après la session 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

Cela fonctionne pour dans tmux 2.1et avec zsh localement et sur les serveurs:

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
}

J'ai dû désactiver l'option allow-rename manuellement avant de changer le nom de Windows - sinon il a été changé pour le chemin actuel sur la plupart de mes serveurs (également en utilisant zsh là-bas). La bonne chose est: si vous réactivez l'option allow-rename, cela fonctionne immédiatement.


0

Ajoutez ceci à .profileou.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

Je noterais dans tous ces exemples avec:

command ssh "$@"

Vous voudrez peut-être saisir le code de sortie et quitter la fonction avec, sinon des choses comme:

ssh server false

Renvoie 0.

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

Quittera ssh avec le code retour du ssh.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.