Establece el título de la ventana de terminal en el directorio actual

71

¿Cómo puedo obtener Terminal.app en OS X para mostrar el directorio actual en su ventana o título de pestaña?

Estoy usando el bash shell.

kareman
fuente
Siempre me pregunto por qué ni siquiera las personas que responden la pregunta recuerdan votarla.
cregox

Respuestas:

60

Depende de tu caparazón.

Este artículo muestra varios métodos.

Personalmente uso zsh que tiene una conveniente función precmd () que se ejecuta antes de cada solicitud.

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

Aunque las otras preguntas enumeran los métodos bash, alias cd. Bash proporciona un método inherente que encadena solo la solicitud.

golpetazo

bash proporciona una variable PROMPT_COMMAND que contiene un comando para ejecutar antes de la solicitud. Este ejemplo (insertado en ~ / .bashrc) establece el título en "username @ hostname: directorio":

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

donde \ 033 es el código de caracteres para ESC y \ 007 para BEL. Tenga en cuenta que la cita es importante aquí: las variables se expanden en "..." y no se expanden en '...'. Entonces PROMPT_COMMAND se establece en un valor no expandido, pero las variables dentro de "..." se expanden cuando se usa PROMPT_COMMAND.

Sin embargo, PWD produce la ruta completa del directorio. Si queremos usar la abreviatura '~', necesitamos incrustar la cadena de escape en el indicador, lo que nos permite aprovechar las siguientes expansiones de indicador proporcionadas por el 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

Por lo tanto, lo siguiente produce un mensaje de "bash $", y un título xterm de "username @ hostname: directorio" ...

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

Tenga en cuenta el uso de [...], que le dice a bash que ignore los caracteres de control que no se imprimen al calcular el ancho de la solicitud. De lo contrario, los comandos de edición de línea se confunden al colocar el cursor.

Darren Hall
fuente
Debería haber mencionado que estoy usando bash, he actualizado la pregunta.
kareman
Se agregó el método bash desde el enlace de la lista.
Darren Hall, el
1
Muy bien. Para obtener solo la ruta al directorio actual en el título y el nombre del directorio actual en el indicador, acabo de usar PS1 = "\ [\ 033] 0; \ w \ 007 \] \ W \ $".
kareman el
1
"Si queremos usar la abreviatura '~', debemos incrustar la cadena de escape en el indicador". Puede usar lo siguiente para reemplazar la ruta completa del directorio de inicio con tilde: $ {PWD / # $ {HOME} / \ ~}
Chris Page
1
@MattTagg Claro, solo necesita ponerlo en su ~/.profilearchivo (o equivalente) en la máquina remota.
coredumperror
32

Copie y pegue en el archivo ~ / .profile:
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"

Esto establecerá el título de la pestaña del terminal actual al nombre de la carpeta en la que se encuentra (NO a la ruta completa).
Entonces ... se
Developer/Applications/Utilities/Bluetooth/convierte en =>Bluetooth

Todo es uno
fuente
3
En los rebeldes, el archivo a editar es ~ / .bash_profile
Tom
11

A partir de Mac OS X Lion 10.7, Terminal tiene una secuencia de escape explícita para configurar el directorio de trabajo, que Terminal muestra usando el ícono "proxy" de la ventana estándar. Esto le permite hacer Comando y hacer clic en él para ver la ruta, revelar en Finder o arrastrarlo como cualquier otra carpeta. Además, Terminal puede usar esto para crear otra terminal en el mismo directorio y restaurar el directorio de trabajo al salir / reiniciar Terminal (cuando Reanudar está habilitado). También permite restaurar directorios para grupos de ventanas.

Es la misma secuencia de escape del Comando del sistema operativo (OSC) que para los títulos de ventanas y pestañas, pero con el primer parámetro establecido en 7. El valor debe ser una URL "file:", que permite caracteres especiales de codificación porcentual para que pueda manejar Todos los nombres de ruta válidos. También debe incluir el nombre de host para que Terminal pueda determinar si se trata de un directorio local; Terminal evitará usarlo como el directorio de trabajo actual si es de un host diferente.

En una nota relacionada, Terminal de manera similar admite la configuración del "archivo representado" utilizando la secuencia de escape OSC con un parámetro de 6. Si está configurado, el icono del proxy mostrará esto en lugar del directorio de trabajo. Por ejemplo, tengo emacs y menos configurados para reflejar el archivo / búfer que se muestra actualmente en el icono del proxy. Esto permite que estos programas basados ​​en tty se integren más con el sistema operativo circundante.

Los comportamientos del directorio de trabajo están habilitados de forma predeterminada para bash (el shell predeterminado en Mac OS X). Ver / etc / bashrc para el código relevante.

Probablemente también valga la pena mencionar que Lion Terminal ahora admite configurar el título de la pestaña independientemente del título de la ventana utilizando la secuencia de escape OSC.

Chris Page
fuente
La update_terminal_cwdfunción establecerá el icono de proxy en el directorio de trabajo actual. Por defecto $PROMPT_COMMANDes update_terminal_cwd.
jtbandes
@jtbandes A eso me refería cuando escribí "Los comportamientos del directorio de trabajo están habilitados por defecto para bash ...".
Chris Page
Sí. ¡Acabo de descubrir cómo funciona y pensé que podría ser útil para futuros googlers!
jtbandes
3

Además de recomendarle que use la secuencia de escape del Comando del Sistema Operativo específico de Apple Terminal: ESC ] Ps ; Pt BELwhere Psis 7and Ptis a file:URL; Vale la pena agregar que en Mac OS X 10.11 (y probablemente desde 10.7) hay un archivo /etc/bashrc_Apple_Terminal(no editable bajo 10.11) que define lo conveniente update_terminal_cwd()como (sin los comentarios):

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"
}

También puede usar esto en sus cajas remotas, en caso de que esté pensando en hacerlo y luego rascarse la cabeza para codificar correctamente la URL del archivo en bash.

Y si cambias PROMPT_COMMANDpor tu cuenta .bash_profileo .bashrcpuedes olvidarte de llamar a esto. En el mismo archivo muestran un ejemplo de encadenamiento un poco mejor con:

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

Personalmente en mi .bash_profilequería agregar el indicador git, así que hice esto:

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
dlamblin
fuente
1

Las soluciones Bash que involucran PS1 y PROMPT_COMMAND fallan si el directorio tiene caracteres Unicode (al menos en Snow Leopard). La mejor solución que se me ocurrió fue hacer el equivalente de

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

Desafortunadamente, esto no funciona directamente, por lo que definí una función de shell para hacer la trllamada:

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

Esto funciona bien para los acentos latinos, que estarán en Unicode NFD (los acentos desaparecerán pero el carácter latino subyacente permanecerá).

Desafortunadamente, fallará por completo para cosas como el chino.

Michael Norrish
fuente
A partir de Mac OS X Lion 10.7, Terminal tiene una secuencia de escape explícita para configurar el directorio de trabajo. Utiliza una URL, por lo que puede utilizar la codificación porcentual para caracteres especiales y admitir todos los nombres de ruta válidos. Vea mi respuesta a esta pregunta para más detalles.
Chris Page
1

Suponiendo que está utilizando el Terminal MAC predeterminado, puede usar el siguiente en .profile ya que "set_prompt" por sí solo puede enviarlo a la carpeta raíz cuando abre una nueva pestaña:

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
Kopz Kyoto
fuente
0

Ingrese esto en su ~ / .profile o archivo equivalente:

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

export PS1='\W \$ '

settitle `pwd`

La primera línea contiene dos caracteres especiales que no se pueden copiar / pegar, pero puede descargar el texto desde aquí: http://blog.nottoobadsoftware.com/files/setterminaltitle.sh .

kareman
fuente
1
"La primera línea contiene dos caracteres especiales que no se pueden copiar / pegar" En lugar de usar el echouso printf, que le permite expresar esos caracteres (ESC y BEL / Control-G) con secuencias de escape:printf '\e]0;$@\a"
Chris Page