Com o Bash + iTerm2, como nomear guias?

176

No iTerm2 (Compilação 1.0.0.20120203), normalmente abro várias guias, cada uma com painéis divididos, e trata de um tema específico do trabalho, por exemplo, controle de revisão, codificação, gerenciamento de arquivos, trabalho do terminal mysql. Normalmente, preciso alternar entre 5 ou mais guias no meu fluxo de trabalho. Às vezes, é difícil lembrar ou dizer qual é qual, observando o conteúdo da tela. Gostaria de nomear as guias de alguma forma, para poder saber rapidamente qual é qual olhando rapidamente. Isso é possível?

qazwsx
fonte
1
possível duplicata de títulos de janela e guia Alterar iTerm2 em zsh
Daniel Beck
Não é totalmente duplicado. Então, como adicionar o aplicativo em execução no momento como parte do título da guia? Ou seja, qual guia está executando o emacs, mysql, etc.?
Qazwsx
1
Ou seja, todas as minhas guias têm o mesmo host e usuário. Portanto, usá-los não diferenciará minhas guias.
Qazwsx
Quer dizer Mostrar nome do trabalho atual nas preferências do iTerm? Observe que o tópico vinculado não é sobre nome de usuário ou host.
Daniel Beck
Certo, quero mostrar algumas indicações de qual programa está sendo executado ou foi executado em cada guia. Além disso, a solução fornecida na outra postagem não funciona para o Bash + iTerm2.
Qazwsx

Respostas:

212

Como você está usando o iterm2 em um mac, outra opção é simplesmente clicar CmdI, digitar algo e pressionar ESC.

A solução do terminal é um pouco mais rápida que isso, mas só queria que você soubesse.

mawaldne
fonte
11
Isso funciona por um segundo até emitir um retorno na guia que renomeei.
Stewie
15
@Stewie Em Preferências -> Perfis -> Terminal, desmarque "Permitir que o terminal relate o título da janela".
Max Cantor
3
Está desmarcado. Ele ainda renomeia o título.
Stewie
6
@SteveBennett não é o "tema" (na verdade, o termo é "perfil"); o comando CMD + I é "Editar sessão atual ..." (no menu Exibir), portanto, está apenas alterando a instância do perfil dessa guia. Pressionar Escape apenas fecha a janela, o que é necessário, pois essa janela não possui um botão "salvar".
MidnightLightning
4
E se você tiver vários painéis abertos? Você precisa renomear cada um para dar um nome completo à guia?
theicfire
119

Encontrei a seguinte função, colocada em minha, ~/.bashrcpara ser útil:

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

Então eu posso chamá-lo no meu prompt do bash da seguinte maneira:

> title I want a pony!

E minha guia é intitulada de acordo.

Jason Sundram
fonte
1
Eu tentei isso, mas ainda não funciona. Eu coloquei essa definição em bash_aliases, e tê-lo colocado na .profile( if [ -f ${HOME}/.bash_aliases ]; then . ${HOME}/.bash_aliases fi) Mas então title dognão virou título guia para "cão"
qazwsx
2
+1 - Adicionei o meu ao / etc / profile apenas porque é onde estão os meus pseudônimos ... não se esqueça de fornecer o arquivo depois que você terminar. Nota: isso também funciona no terminal.
blak3r
3
Muito útil. Eu queria um pônei; e eu tenho um!
SoEzPz 26/10/2015
1
Coloquei o meu no .bash_profile, reiniciei e funcionou como um encanto.
C Johnson
1
Aqueles que acham que não funciona é porque seu prompt de comando muda instantaneamente. Tente title dog && sleep 5e você verá que funciona. Observe a resposta de @schpet para resolver este problema #
Mikhail
45

execute este comando para definir o título da sua guia ou janela:

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

Eu adicionei o seguinte ao meu ~/.bash_profilepara sempre listar o diretório atual em relação ao meu diretório pessoal:

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

útil quando você possui 100 terminais minimizados no seu dock

dica de chapéu para o mundo mac

schpet
fonte
o escape desse comando de exportação não funcionou no meu bash por algum motivo (v5.0.7), eis o que funcionou para mim:export PROMPT_COMMAND='echo -ne "\033]0;${PWD/$HOME/\~}\007"'
Mike Fogel
18

Usei soluções semelhantes às anteriores por um bom tempo, mas utilizo guias suficientes que também quero que sejam codificadas por cores para facilitar a referência visual. Então , criei o tabset , um utilitário para definir o título, o emblema e a cor da guia, com base no tipo de trabalho que estou realizando em cada guia.

exemplo

Requer , mas agora é uma plataforma comumente instalada. Para instalar:

npm install -g iterm2-tab-set
Jonathan Eunice
fonte
Isso é incrível! Adoro especialmente a configuração automática da cor da guia. Obrigado!
Ashutosh Jindal
1
Uau! Essa é uma ótima ferramenta!
dmulvi
Atualmente, uso esse método em vez do descrito na resposta aceita (<kbd> Cmd </kbd> <kbd> I </kbd>, digite algo e pressione <kbd> ESC </kbd>)
qazwsx
but that is now a commonly installed platformHahaha.ha ... ha ...... espere, você está falando sério ?
Fake Name
Sim, sério. Os desenvolvedores e o pessoal de DevOps - atualmente, o público-alvo natural dos aplicativos de terminal - têm o node.js instalado. Ou pode instalá-lo facilmente. Aqueles que não / não podem, são bem-vindos a recorrer às abordagens baseadas no bash / zsh / etc.
Jonathan Eunice
16

Adicione esta função ao seu ~/.bash_profilearquivo e ela deve funcionar.

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

Eu gosto deste:

#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

Isso permitirá que você alterne o nome de uma guia entre um nome personalizado e o padrão do seu CWD.

title -> o título da sua guia será ~/YOUR_CWD/

title hey there -> o título da sua guia será hey there

taylorstine
fonte
Observe que, como está, isso prejudicará a integração do shell iTerm.
Michael
5

Eu realmente gosto da resposta de taylorstine , mas quebra a integração de shell do iTerm2, que depende da PROMPT_COMMANDvariável. Você pode modificar o código de Taylor para corrigir isso adicionando o __bp_precmd_invoke_cmdretorno PROMPT_COMMANDsempre que mexer nele:

# 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
fonte
3

Eu gosto da resposta do Michael .

Mas e se .iterm2_shell_integration.bashnão existir?

Aqui está a minha opinião:

# 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
user1318024
fonte
1
Observe que na v3.1, iterm2_preexec_invoke_cmdtornou-se #__bp_precmd_invoke_cmd
Michael
2

Se você estiver trabalhando com perfis (o que é muito conveniente): Preferências -> Aparência -> Títulos de janelas e guias: marque 'Mostrar nome do perfil':

imagem

É assim que funciona:

miniatura vinculada à imagem principal

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

O comentário de Max Cantor funcionou para mim.

B Seven
fonte
1

Acho que a Troca automática de perfis e os selos foram projetados exatamente para o que você precisa:

Troca automática de perfil O iTerm2 pode usar as informações que conhece sobre seu caminho atual, nome do host e nome do usuário para alterar perfis. Por exemplo, a cor de fundo da sua janela ou a codificação de caracteres do terminal pode mudar ao conectar-se a hosts diferentes.

Crachás Você pode colocar um crachá no canto superior direito do seu terminal, mostrando informações sobre a sessão atual. Ele pode mostrar seu nome de usuário, nome de host ou mesmo dados personalizados, como a ramificação git atual.

então o resultado pode ser assim:

insira a descrição da imagem aqui

lengxuehx
fonte
Cite as partes essenciais da resposta nos links de referência, pois a resposta pode se tornar inválida se as páginas vinculadas forem alteradas.
DavidPostill
0

Eu gostaria de estender um pouco a resposta de B Seven para absoluta clareza.

Como a maioria de nós gostaria de saber como é possível definir o título de uma guia, mesmo quando eles não estão no shell local, em vez de no shell remoto (por exemplo, sobre ssh).

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

Etapa 2. Para cada guia, double click on the tab -> Session Title

Agora, o que você definir no título da sessão, ele permanecerá como está.

Krishna Gupta
fonte
-2

Yuk, todos esses apelidos e funções. Solução mais fácil (se você for root), cole-o em um terminal:

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

Ou simplesmente faça um título de chamada de arquivo em algum lugar do seu caminho ou caminho global e cole as duas linhas entre o EOF.

Orwellophile
fonte
12
"Yuk com todos esses pseudônimos." Insere a resposta que ninguém pode lembrar ou digitar manualmente.
Dan
1
Não @ Dan dizendo que isso é ótimo, só que não há necessidade de lembrar que uma vez que é apenas criar um script chamado titleem /usr/bin.
Emile Bergeron
@EmileBergeron thx, embora pareça que você (nós) seja uma minoria. A resposta foi apenas uma linha, o resto é para pessoas preguiçosas.
Orwellophile