Avec Bash + iTerm2, comment nommer les onglets?

176

Dans iTerm2 (version 1.0.0.20120203), j’ouvre généralement plusieurs onglets, chacun d’eux ayant des volets divisés. Il s’agit d’un thème de travail particulier, par exemple le contrôle des révisions, le codage, la gestion des fichiers, le travail au terminal mysql. Je dois généralement basculer entre 5 onglets ou plus dans mon flux de travail. Il est parfois difficile de se rappeler ou de dire lequel est lequel en regardant le contenu de l'écran. J'aimerais nommer les onglets d'une manière ou d'une autre, afin que je puisse rapidement dire lequel est lequel en regardant rapidement. Est-ce possible?

Qazwsx
la source
1
duplication possible des titres de la fenêtre et des onglets Change iTerm2 en zsh
Daniel Beck
Pas tout à fait dupliqué. Alors, comment ajouter l'application en cours d'exécution dans le cadre du titre de l'onglet? C'est-à-dire quel onglet exécute emacs, mysql, etc.?
Qazwsx
1
C'est-à-dire que tous mes onglets ont le même hôte et le même utilisateur. Donc, utiliser ceux-ci ne différenciera pas mes onglets.
Qazwsx
Vous voulez dire que vous voulez Afficher le nom du travail actuel à partir des préférences de iTerm? Notez que le sujet lié ne concerne pas le nom d'utilisateur ou l'hôte.
Daniel Beck
D'accord, je veux montrer quelques indications sur le programme en cours d'exécution ou sur celui exécuté dans chaque onglet. En outre, la solution donnée dans l'autre message ne fonctionne pas pour Bash + iTerm2.
Qazwsx

Réponses:

212

Puisque vous utilisez iterm2 sur un mac, une autre option consiste à cliquer CmdI, taper quelque chose et cliquer ESC.

La solution de terminal est un peu plus rapide que cela, mais je voulais juste vous le faire savoir.

Mawaldne
la source
11
Cela fonctionne pendant une seconde jusqu'à ce que je génère un retour sur l'onglet que j'ai renommé.
Stewie
15
@Stewie Dans Préférences -> Profils -> Terminal, décochez "Autoriser le terminal à signaler le titre de la fenêtre".
Max Cantor
3
C'est décoché. Il renomme toujours le titre.
Stewie
6
@SteveBennett n'est pas le "thème" (en réalité, le terme est "profil") lui-même; La commande CMD + I est "Edit Current Session ..." (dans le menu View), il ne s'agit donc que de changer l'instance du profil de cet onglet. En appuyant sur Echap ferme simplement la fenêtre, ce qui est nécessaire car cette fenêtre n'a pas de bouton "Enregistrer".
MidnightLightning
4
Et si vous avez plusieurs volets ouverts? Devez-vous renommer chacun pour nommer complètement l'onglet lui-même?
theicfire
119

J'ai trouvé la fonction suivante, placée dans mon ~/.bashrcaide:

function title {
    echo -ne "\033]0;"$*"\007"
}

Ensuite, je peux l'appeler à partir de mon invite bash comme suit:

> title I want a pony!

Et mon onglet s'intitule en conséquence.

Jason Sundram
la source
1
J'ai essayé ça, mais ça ne marche toujours pas. J'ai mis cette définition dans bash_aliases, et l'ai chargé dans .profile( if [ -f ${HOME}/.bash_aliases ]; then . ${HOME}/.bash_aliases fi), mais alors title dogne pas transformer le titre de l'onglet en "chien"
qazwsx
2
+1 - J'ai ajouté le mien à / etc / profile parce que c'est là que se trouvent mes alias ... n'oubliez pas de rechercher le fichier une fois que vous avez terminé. Remarque: cela fonctionne également dans le terminal.
blak3r
3
Très utile. Je voulais un poney; et j'en ai un!
SoEzPz
1
J'ai mis le mien dans .bash_profile, redémarré et cela a fonctionné à merveille.
C Johnson
1
Ceux qui pensent que cela ne fonctionne pas, c’est que votre invite de commande le rétablit instantanément. Essayez title dog && sleep 5et vous verrez que cela fonctionne. Notez la réponse de @schpet pour résoudre ce problème
Mikhail
45

lancez cette commande pour définir le titre de votre onglet ou de votre fenêtre:

export PROMPT_COMMAND='echo -ne "\033]0;YOUR NAME HERE\007"'

J'ai ajouté ce qui suit à ma ~/.bash_profileliste toujours le répertoire courant par rapport à mon répertoire personnel:

export PROMPT_COMMAND='echo -ne "\033]0;${PWD/#$HOME/~}\007"'

utile lorsque vous avez 100 terminaux minimisés dans votre station d'accueil

pointe du chapeau au monde mac

schpet
la source
l'échappement sur cette commande d'exportation n'a pas vraiment fonctionné sur mon bash pour une raison quelconque (v5.0.7), voici ce qui a fonctionné pour moi:export PROMPT_COMMAND='echo -ne "\033]0;${PWD/$HOME/\~}\007"'
Mike Fogel Le
18

J'ai utilisé des solutions similaires aux solutions ci-dessus pendant un bon bout de temps, mais j'ai utilisé suffisamment d'onglets pour que je veuille aussi les coder par couleur pour faciliter la référence visuelle. J'ai donc mis au point Tabset , un utilitaire permettant de définir le titre, le badge et la couleur de l'onglet en fonction du type de travail effectué dans chaque onglet.

exemple

Cela nécessite un nœud , mais c'est maintenant une plate-forme couramment installée. À installer:

npm install -g iterm2-tab-set
Jonathan Eunice
la source
C'est génial! J'aime particulièrement le réglage automatique de la couleur de l'onglet. Je vous remercie!
Ashutosh Jindal
1
Hou la la! C'est un excellent outil!
dmulvi
J'utilise actuellement cette méthode à la place de celle décrite dans la réponse acceptée (<kbd> Cmd </ kbd> <kbd> I </ kbd>, tapez quelque chose et cliquez sur <kbd> ESC </ kbd>)
qazwsx
but that is now a commonly installed platformHahaha.ha ... ha ......, attendez, êtes-vous sérieux ?
Faux nom
Oui, serieux. Les développeurs et les utilisateurs de DevOps - de nos jours, le public cible naturel des applications de terminal - ont installé node.js. Ou peut l'installer facilement. Ceux qui ne le peuvent pas ou ne le peuvent pas sont invités à se rabattre sur des approches basées sur bash / zsh / etc.
Jonathan Eunice
16

Ajoutez cette fonction à votre ~/.bash_profilefichier et cela devrait fonctionner.

function title ()
{
    TITLE=$*;
    export PROMPT_COMMAND='echo -ne "\033]0;$TITLE\007"'
}
jiangyu7408
la source
7

J'aime celui la:

#setup terminal tab title
function title {
    if [ "$1" ]
    then
        unset PROMPT_COMMAND
        echo -ne "\033]0;${*}\007"
    else
        export PROMPT_COMMAND='echo -ne "\033]0;${PWD/#$HOME/~}\007"'
    fi
}
title

Cela vous permettra de basculer le nom d'un onglet entre un nom personnalisé et un défaut de votre CWD.

title -> le titre de votre onglet sera ~/YOUR_CWD/

title hey there -> le titre de votre onglet sera hey there

la taylorstine
la source
Notez que tel quel
Michael
5

J'aime beaucoup la réponse de taylorstine , mais elle rompt l’intégration de la coque d’iTerm2 qui repose sur la PROMPT_COMMANDvariable. Vous pouvez modifier le code de Taylor pour corriger cela en rajoutant le __bp_precmd_invoke_cmddans PROMPT_COMMANDn'importe quel moment où vous le bricolez:

# iTerm2 shell integration
test -e "${HOME}/.iterm2_shell_integration.bash" && source "${HOME}/.iterm2_shell_integration.bash"

# iTerm2 tab titles
function title {
    if [ "$1" ]
    then
        export PROMPT_COMMAND='__bp_precmd_invoke_cmd'
        echo -ne "\033]0;${*}\007"
    else
        export PROMPT_COMMAND='echo -ne "\033]0;${PWD/#$HOME/\~}\007";__bp_precmd_invoke_cmd'
    fi
}
title
Michael
la source
3

J'aime la réponse de Michael .

Mais que faire si .iterm2_shell_integration.bashn'existe pas?

Voici ma prise:

# iTerm2 shell integration
test -e "${HOME}/.iterm2_shell_integration.bash" && source "${HOME}/.iterm2_shell_integration.bash"

# iTerm2 tab titles
function title {
  if [ "$1" ] ; then
    test -e "${HOME}/.iterm2_shell_integration.bash" \
      && export PROMPT_COMMAND='iterm2_preexec_invoke_cmd' \
      || unset PROMPT_COMMAND
    echo -ne "\033]0;${*}\007"
  else
    test -e "${HOME}/.iterm2_shell_integration.bash" \
      && export PROMPT_COMMAND='echo -ne "\033]0;${PWD/#$HOME/~}\007";iterm2_preexec_invoke_cmd' \
      || export PROMPT_COMMAND='echo -ne "\033]0;${PWD/#$HOME/~}\007"'
  fi
}
title
utilisateur1318024
la source
1
Notez que dans la v3.1, iterm2_preexec_invoke_cmdest devenu__bp_precmd_invoke_cmd
Michael le
2

Si vous utilisez des profils (ce qui est très pratique): Préférences -> Apparence -> Titres de fenêtre et d'onglet: cochez la case "Afficher le nom du profil":

image

Voilà comment ça se passe:

vignette liée à l'image principale

aianitro
la source
2
Preferences -> Profiles -> Terminal
  uncheck Terminal may set Tab/Window title

Le commentaire de Max Cantor a fonctionné pour moi.

B Seven
la source
1

Je pense que la commutation automatique de profils et les badges sont exactement conçus pour répondre à vos besoins:

Changement automatique de profil iTerm2 peut utiliser les informations dont il dispose sur votre chemin actuel, votre nom d’hôte et votre nom d’utilisateur pour modifier les profils. Par exemple, la couleur d'arrière-plan de votre fenêtre ou le codage des caractères du terminal peuvent changer lors de la connexion à différents hôtes.

Badges Vous pouvez placer un badge en haut à droite de votre terminal affichant des informations sur la session en cours. Il peut afficher votre nom d'utilisateur, votre nom d'hôte ou même des données personnalisées comme la branche git actuelle.

alors le résultat peut ressembler à ceci:

entrez la description de l'image ici

lengxuehx
la source
Veuillez citer les parties essentielles de la réponse à partir du (des) lien (s) de référence, car la réponse peut devenir invalide si la ou les pages liées changent.
DavidPostill
0

J'aimerais étendre un peu la réponse de B Seven pour plus de clarté.

Puisque la plupart d’entre nous aimeraient savoir comment on peut définir le titre d’un onglet même quand ils ne sont pas dans un shell local, au lieu d’un shell distant (par exemple sur ssh).

Étape 1. Preferences -> Profiles -> Terminal uncheck Terminal may set Tab/Window title

Étape 2. Pour chaque onglet, double click on the tab -> Session Title

Maintenant, quoi que vous définissiez dans le titre de la session, il resterait tel quel.

Krishna Gupta
la source
-2

Yuk, tous ces alias et fonctions. Solution plus facile (si vous êtes root), collez ceci dans un terminal:

TARGET=/usr/bin/title
sudo tee "$TARGET" <<'EOF'
#!/usr/bin/env bash
echo -ne "\033]0;$*\007"
EOF
sudo chmod 755 "$TARGET"

Vous pouvez également créer un titre d’appel de fichier quelque part dans votre chemin ou un chemin global et coller les deux lignes entre EOF.

Orwellophile
la source
12
"Yuk avec tous ces pseudonymes." Les réponses entrent que personne ne peut se rappeler ou taper à la main.
Dan
1
@ Dan ne dis pas que ce qui est excellent, juste qu'il n'y a pas besoin de se rappeler que , depuis qu'il est juste de créer un script appelé titledans /usr/bin.
Emile Bergeron
@ EmileBergeron thx, même s'il semble que vous (nous) sommes en minorité. La réponse était seulement 1 ligne, le reste est pour les paresseux.
Orwellophile