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

69

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

Estou usando o shell bash.

    
por kareman 07.12.2009 / 19:27

7 respostas

59

Depende do seu shell.

Este artigo exibe vários métodos .

Eu pessoalmente uso o zsh que tem uma 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 usam o cd. O Bash fornece um método inerente que encadeia apenas o prompt.

bash

bash supplies a variable PROMPT_COMMAND which contains a command to execute before the prompt. This example (inserted in ~/.bashrc) sets the title to "username@hostname: directory":

 PROMPT_COMMAND='echo -ne "3]0;${USER}@${HOSTNAME}: ${PWD}
\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
7"'

where 3 is the character code for ESC, and

Thus, the following produces a prompt of "bash$ ", and an xterm title of "username@hostname: directory" ...

7 for BEL. Note that the quoting is important here: variables are expanded in "...", and not expanded in '...'. So PROMPT_COMMAND is set to an unexpanded value, but the variables inside "..." are expanded when PROMPT_COMMAND is used.

However, PWD produces the full directory path. If we want to use the '~' shorthand we need to embed the escape string in the prompt, which allows us to take advantage of the following prompt expansions provided by the shell:

 case $TERM in
     xterm*)
        PS1="\[3]0;\u@\h: \w    precmd () { print -Pn "\e]2;%n@%M | %~\a" } # title bar prompt
7\]bash\$ " ;; *) PS1="bash\$ " ;; esac

Note the use of [...], which tells bash to ignore the non-printing control characters when calculating the width of the prompt. Otherwise line editing commands get confused while placing the cursor.

 PROMPT_COMMAND='echo -ne "3]0;${USER}@${HOSTNAME}: ${PWD}
\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
7"'
%bl0ck_qu0te%     
por 07.12.2009 / 20:01
31

Copiar & cole no arquivo ~ / .profile: PROMPT_COMMAND="echo -ne \"3]0;${PWD##*/}Developer/Applications/Utilities/Bluetooth/7\"; $PROMPT_COMMAND"

Isso definirá o título da guia do terminal atual como o nome da pasta em que você está (e NÃO o caminho inteiro).
Então ...
Bluetooth se torna = > %code%

    
por 12.03.2012 / 09:22
11

A partir do Mac OS X Lion 10.7, o Terminal possui uma sequência de escape explícita para configurar o diretório de trabalho, que o Terminal exibe usando o ícone "proxy" de janela padrão. Isso permite que você clique em Comando 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 para restaurar o diretório de trabalho ao sair / reiniciar o Terminal (quando Resume estiver ativado). Ele também permite restaurar diretórios para grupos de janelas.

É a mesma sequência de escape do OSC (Operating System Command) para os títulos de janela e tabulação, mas com o primeiro parâmetro definido como 7. O valor deve ser um URL "file:", que permite caracteres especiais de codificação percentual ele pode 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 seqüência de escape do OSC com um parâmetro 6. Se configurado, o ícone do proxy exibirá isso em vez do diretório de trabalho. Por exemplo, eu tenho 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 SO circundante.

Os comportamentos do diretório de trabalho são habilitados 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.

    
por 11.08.2011 / 08:50
3

Além de recomendar que você use a sequência de escape do Comando do sistema operacional específico do Terminal da Apple: ESC ] Ps ; Pt BEL em que Ps é 7 e Pt é file: URL; Vale acrescentar que no Mac OS X 10.11 (e provavelmente desde 10.7) há um arquivo /etc/bashrc_Apple_Terminal (não editável em 10.11) que define o conveniente update_terminal_cwd() as (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, em seguida, coçando a cabeça na codificação correta da URL do arquivo no bash.

E se você alterar PROMPT_COMMAND no seu próprio .bash_profile ou .bashrc , poderá esquecer de chamar isso. No mesmo arquivo, eles mostram um exemplo de encadeamento um pouco melhor com:

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

Pessoalmente, em meu .bash_profile , eu 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
    
por 05.05.2016 / 19:13
1

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

PS1="\[3]0;\'pwd | tr -dC '[
termtitlefilter () { tr -dC '[
PS1="\[3]0;\'pwd | tr -dC '[
termtitlefilter () { tr -dC '[%pre%0-7]'; }
PS1="\[3]0;\'pwd | termtitlefilter\'%pre%7\]\$ "
0-7]'\'%pre%7\]\$ "
0-7]'; } PS1="\[3]0;\'pwd | termtitlefilter\'%pre%7\]\$ "
0-7]'\'%pre%7\]\$ "

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

%pre%

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

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

    
por 30.07.2010 / 04:07
1

Supondo que você esteja usando o terminal MAC padrão, você pode usar o seguinte em .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 "3]0;$BASE_PATH
set_prompt () {
    BASE_PATH="${PWD##*/}"
    echo -ne "3]0;$BASE_PATH%pre%7"
}
set_my_tab () {
   update_terminal_cwd
   set_prompt
}

PROMPT_COMMAND=set_my_tab
7" } set_my_tab () { update_terminal_cwd set_prompt } PROMPT_COMMAND=set_my_tab
    
por 27.03.2015 / 20:20
0

Insira isso no 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 baixar o texto aqui: link .

    
por 07.12.2009 / 20:01