Defina o título da janela do terminal para o diretório atual


71

Como posso obter o Terminal.app no ​​OS X para exibir o diretório atual em sua janela ou título da guia?

Estou usando o shell bash.


Eu sempre me pergunto por que nem mesmo as pessoas que respondem à pergunta se lembram de votar.
cregox

Respostas:


60

Depende do seu shell.

Este artigo exibe vários métodos.

Pessoalmente, uso o zsh, que possui uma conveniente função precmd (), que é executada antes de cada prompt.

    precmd () { print -Pn "\e]2;%n@%M | %~\a" } # title bar prompt

Embora as outras perguntas listem métodos bash, eles também apelidam de cd. O Bash fornece um método inerente que encadeia apenas o prompt.

bater

O bash fornece uma variável PROMPT_COMMAND que contém um comando a ser executado antes do prompt. Este exemplo (inserido em ~ / .bashrc) define o título para "nome de usuário @ nome do host: diretório":

 PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'

onde \ 033 é o código de caractere para ESC e \ 007 para BEL. Observe que a citação é importante aqui: variáveis ​​são expandidas em "..." e não expandidas em '...'. Portanto, PROMPT_COMMAND é definido como um valor não expandido, mas as variáveis ​​dentro de "..." são expandidas quando PROMPT_COMMAND é usado.

No entanto, o PWD produz o caminho completo do diretório. Se queremos usar a abreviação '~', precisamos incorporar a string de escape no prompt, o que nos permite tirar proveito das seguintes expansões de prompt fornecidas pelo shell:

\u          expands to $USERNAME
\h          expands to hostname up to first '.'
\w          expands to directory, replacing $HOME with '~'
\[...\]     embeds a sequence of non-printing characters

Assim, o seguinte produz um prompt de "bash $" e um título xterm de "nome de usuário @ nome do host: diretório" ...

 case $TERM in
     xterm*)
        PS1="\[\033]0;\u@\h: \w\007\]bash\$ "
        ;;
     *)
        PS1="bash\$ "
        ;;
 esac

Observe o uso de [...] que informa ao bash para ignorar os caracteres de controle que não imprimem ao calcular a largura do prompt. Caso contrário, os comandos de edição de linha ficam confusos ao colocar o cursor.


Deveria ter mencionado que estou usando o bash, atualizei a pergunta.
7123 kareman

Adicionado o método bash no link listado.
7117 Darren Hall

11
Muito bom. Para obter apenas o caminho para o diretório atual no título e o nome do diretório atual no prompt, usei PS1 = "\ [\ 033] 0; \ w \ 007 \] \ W \ $".
kareman

11
"Se queremos usar a abreviação '~', precisamos incorporar a string de escape no prompt" Você pode usar o seguinte para substituir o nome do caminho completo do diretório inicial pelo til: $ {PWD / # $ {HOME} / \ ~}
Chris Página

11
@MattTagg Claro, você só precisa colocá-lo no seu ~/.profilearquivo (ou equivalente) na máquina remota.
Coredumperror

32

Copie e cole no arquivo ~ / .profile:
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"

Isso definirá o título da guia atual do terminal com o nome da pasta em que você está (NÃO o caminho inteiro).
Então ...
Developer/Applications/Utilities/Bluetooth/torna-se =>Bluetooth


3
Em mavericks o arquivo para editar é ~ / .bash_profile
Tom

11

No Mac OS X Lion 10.7, o Terminal possui uma seqüência de escape explícita para definir o diretório de trabalho, que o Terminal exibe usando o ícone "proxy" da janela padrão. Isso permite que você clique com a tecla Command pressionada para ver o caminho, revelar no Finder ou arrastá-lo como qualquer outra pasta. Além disso, o Terminal pode usar isso para criar outro terminal no mesmo diretório e restaurar o diretório de trabalho ao sair / reiniciar o Terminal (quando Continuar estiver ativado). Também permite restaurar diretórios para grupos de janelas.

É a mesma sequência de escape OSC (Comando do Sistema Operacional) dos títulos da janela e da guia, mas com o primeiro parâmetro definido como 7. O valor deve ser um URL "file:", que permite caracteres especiais de codificação percentual para que ele possa manipular todos os nomes de caminho válidos. Você também deve incluir o nome do host para que o Terminal possa determinar se é um diretório local; O Terminal evitará usá-lo como o diretório de trabalho atual, se for de um host diferente.

Em uma nota relacionada, o Terminal também suporta a configuração do "arquivo representado" usando a sequência de escape OSC com um parâmetro 6. Se definido, o ícone do proxy exibirá isso em vez do diretório de trabalho. Por exemplo, eu tenho o emacs e menos configurado para refletir o arquivo / buffer atualmente exibido no ícone do proxy. Isso permite que esses programas baseados em tty sejam mais integrados ao sistema operacional circundante.

Os comportamentos do diretório de trabalho são ativados por padrão para o bash (o shell padrão no Mac OS X). Veja / etc / bashrc para o código relevante.

Também vale a pena mencionar que o Lion Terminal agora suporta a configuração do título da guia independentemente do título da janela usando a sequência de escape do OSC.


A update_terminal_cwdfunção definirá o ícone do proxy para o diretório de trabalho atual. Por padrão $PROMPT_COMMANDé update_terminal_cwd.
Jtbandes

@jtbandes É a isso que eu estava me referindo quando escrevi “Os comportamentos do diretório de trabalho são ativados por padrão para o bash…”.
Chris Página

Sim. Acabei de descobrir como funciona e achei que poderia ser útil para futuros googlers!
Jtbandes

3

Além de recomendar o uso da sequência de escape de comando do sistema operacional específica do Apple Terminal: ESC ] Ps ; Pt BELonde Psé 7e Pté um file:URL; vale a pena acrescentando que no Mac OS X 10.11 (e provavelmente desde 10,7) há um arquivo /etc/bashrc_Apple_Terminal(não editável sob 10.11) que define o conveniente update_terminal_cwd()como (sem os comentários):

update_terminal_cwd () 
{ 
    local url_path='';
    { 
        local i ch hexch LC_CTYPE=C LC_ALL=;
        for ((i = 0; i < ${#PWD}; ++i))
        do
            ch="${PWD:i:1}";
            if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
                url_path+="$ch";
            else
                printf -v hexch "%02X" "'$ch";
                url_path+="%${hexch: -2:2}";
            fi;
        done
    };
    printf '\e]7;%s\a' "file://$HOSTNAME$url_path"
}

Você também pode usar isso em suas caixas remotas, caso esteja pensando em fazê-lo e depois coçando a cabeça para codificar corretamente o URL do arquivo no bash.

E se você mudar PROMPT_COMMANDpor conta própria .bash_profileou .bashrcse esquecer de ligar para isso. No mesmo arquivo, eles mostram um exemplo de encadeamento um pouco melhor com:

PROMPT_COMMAND="update_terminal_cwd${PROMPT_COMMAND:+; $PROMPT_COMMAND}"

Pessoalmente, .bash_profileeu queria adicionar o prompt do git, então fiz isso:

local git_path=/Applications/Xcode.app/Contents/Developer/usr/share/git-core
for f in $git_path/git-completion.bash $git_path/git-prompt.sh
do
  if [[ -f "$f" ]]; then
    . "$f"
  fi
done
get_sha() {
    git rev-parse --short HEAD 2>/dev/null
}
if [ "function" = $(type -t __git_ps1) ]; then
    export GIT_PS1_SHOWDIRTYSTATE=1
    GIT_PS1_SHOWSTASHSTATE=1
    GIT_PS1_SHOWUNTRACKEDFILES=1
    GIT_PS1_SHOWCOLORHINTS=1
    GIT_PS1_DESCRIBE_STYLE="branch"
    GIT_PS1_SHOWUPSTREAM="auto git"
    export PROMPT_COMMAND="$PROMPT_COMMAND${PROMPT_COMMAND:+; }"'__git_ps1 "\[\e[0;32m\]\u\[\e[1;32m\]@\h\[\e[0m\]:\[\e[0;34m\]\w\[\e[0m\]" "\$ " "\n{%s $(get_sha)}"'
fi

1

As soluções Bash que envolvem PS1 e PROMPT_COMMAND falham se o diretório tiver caracteres Unicode (pelo menos no Snow Leopard). A melhor solução que eu consegui foi fazer o equivalente a

PS1="\[\033]0;\`pwd | tr -dC '[\000-\177]'\`\007\]\$ "

Infelizmente, isso não funciona diretamente, então, em vez disso, defini uma função shell para fazer a trchamada:

termtitlefilter () { tr -dC '[\000-\177]'; }
PS1="\[\033]0;\`pwd | termtitlefilter\`\007\]\$ "

Isso funciona bem para acentos latinos, que estarão no Unicode NFD (os acentos desaparecerão, mas o caractere latino subjacente permanecerá).

Infelizmente, falhará completamente em coisas como o chinês.


No Mac OS X Lion 10.7, o Terminal possui uma sequência de escape explícita para definir o diretório de trabalho. Ele usa uma URL, para que você possa usar a codificação percentual para caracteres especiais e dar suporte a todos os nomes de caminho válidos. Veja minha resposta a esta pergunta para obter detalhes.
21411 Chris Página

1

Supondo que você esteja usando o Terminal MAC padrão, você pode usar o seguinte no .profile, já que "set_prompt" por si só pode enviar você para a pasta raiz quando você abre uma nova guia:

set_prompt () {
    BASE_PATH="${PWD##*/}"
    echo -ne "\033]0;$BASE_PATH\007"
}
set_my_tab () {
   update_terminal_cwd
   set_prompt
}

PROMPT_COMMAND=set_my_tab

0

Digite isso no seu arquivo ~ / .profile ou equivalente:

function settitle() { echo -n "]0;$@"; }
function cd() { command cd "$@"; settitle `pwd -P`; }

export PS1='\W \$ '

settitle `pwd`

A primeira linha contém dois caracteres especiais que não podem ser copiados / colados, mas você pode fazer o download do texto aqui: http://blog.nottoobadsoftware.com/files/setterminaltitle.sh .


11
"A primeira linha contém dois caracteres especiais que não podem ser copiados / colados" Em vez de usar echouse printf, que permite expressar esses caracteres (ESC e BEL / Control-G) com seqüências de escape:printf '\e]0;$@\a"
Chris Page
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.