Ustaw tytuł okna terminala na bieżący katalog

71

Jak mogę uzyskać Terminal.app w OS X, aby wyświetlić bieżący katalog w tytule okna lub karty?

Używam powłoki bash.

Kareman
źródło
Zawsze zastanawiam się, dlaczego nawet ludzie, którzy odpowiedzą na pytanie, nie pamiętają o głosowaniu.
cregox

Odpowiedzi:

60

Zależy od twojej powłoki.

W tym artykule przedstawiono wiele metod.

Ja osobiście używam zsh, który ma wygodną funkcję precmd (), która jest uruchamiana przed każdym monitem.

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

Chociaż w innych pytaniach wymieniono metody bash, aliasy cd. Bash zapewnia nieodłączną metodę, która oddziela tylko monity.

grzmotnąć

bash dostarcza zmienną PROMPT_COMMAND, która zawiera polecenie do wykonania przed pytaniem. Ten przykład (wstawiony do ~ / .bashrc) ustawia tytuł na „nazwa użytkownika @ nazwa hosta: katalog”:

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

gdzie \ 033 to kod znaku dla ESC, a \ 007 dla BEL. Zauważ, że cytowanie jest tutaj ważne: zmienne są rozwinięte w „...”, a nie rozwinięte w „...”. Zatem PROMPT_COMMAND jest ustawiony na nierozwiniętą wartość, ale zmienne wewnątrz „...” są rozwijane, gdy używany jest PROMPT_COMMAND.

PWD tworzy jednak pełną ścieżkę do katalogu. Jeśli chcemy użyć skrótu „~”, musimy osadzić ciąg znaków ucieczki w wierszu polecenia, co pozwala nam skorzystać z następujących rozszerzeń poleceń udostępnianych przez powłokę:

\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

W związku z tym poniższe polecenie generuje monit „bash $” i tytuł xterm „nazwa użytkownika @ nazwa hosta: katalog” ...

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

Zwróć uwagę na użycie [...], które każe bashowi zignorować niedrukowalne znaki kontrolne podczas obliczania szerokości pytania. W przeciwnym razie polecenia edycji linii są mylone podczas umieszczania kursora.

Darren Hall
źródło
Powinienem wspomnieć, że używam bash, zaktualizowałem pytanie.
kareman
Dodano metodę bash z podanego linku.
Darren Hall,
1
Bardzo dobre. Aby uzyskać tylko ścieżkę do bieżącego katalogu w tytule i nazwę bieżącego katalogu w wierszu, właśnie użyłem PS1 = "\ [\ 033] 0; \ w \ 007 \] \ W \ $".
kareman
1
„Jeśli chcemy użyć skrótu„ ~ ”, musimy osadzić ciąg znaków ucieczki w wierszu polecenia„ Możesz użyć poniższej opcji, aby zastąpić pełną ścieżkę do katalogu domowego tyldą: $ {PWD / # $ {HOME} / \ ~}
Chris Page
1
@MattTagg Oczywiście, wystarczy umieścić go w swoim ~/.profile(lub równoważnym) pliku na zdalnym komputerze.
coredumperror
32

Skopiuj i wklej do pliku ~ / .profile:
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"

Spowoduje to ustawienie tytułu bieżącej karty terminala na nazwę folderu, w którym się znajdujesz (NIE całą ścieżkę).
Więc ...
Developer/Applications/Utilities/Bluetooth/staje się =>Bluetooth

Wszystko jest jednym
źródło
3
Na urządzeniach indywidualnych plik do edycji to ~ / .bash_profile
Tom
11

Począwszy od systemu Mac OS X Lion 10.7, Terminal ma jawną sekwencję ucieczki do ustawiania katalogu roboczego, który Terminal wyświetla za pomocą standardowej ikony „proxy” w oknie. Umożliwia to kliknięcie z wciśniętym klawiszem Command, aby zobaczyć ścieżkę, odsłonić w Finderze lub przeciągnąć jak jakikolwiek inny folder. Ponadto Terminal może to wykorzystać do utworzenia innego terminala w tym samym katalogu oraz do przywrócenia katalogu roboczego podczas zamykania / ponownego uruchamiania Terminalu (gdy włączone jest Wznowienie). Umożliwia także przywracanie katalogów dla grup okien.

Jest to ta sama sekwencja zmiany znaczenia komendy systemu operacyjnego, jak w przypadku tytułów okien i kart, ale z pierwszym parametrem ustawionym na 7. Wartość powinna być adresem URL „file:”, który umożliwia kodowanie procentowe znaków specjalnych, aby mógł obsługiwać wszystkie poprawne nazwy ścieżek. Powinieneś także dołączyć nazwę hosta, aby Terminal mógł ustalić, czy jest to katalog lokalny; Terminal uniknie używania go jako bieżącego katalogu roboczego, jeśli pochodzi z innego hosta.

W powiązanej notatce Terminal podobnie obsługuje ustawianie „reprezentowanego pliku” za pomocą sekwencji ucieczki OSC z parametrem 6. Jeśli jest ustawiony, ikona proxy wyświetli to zamiast katalogu roboczego. Na przykład mam emacsa i mniej skonfigurowane do odzwierciedlania aktualnie wyświetlanego pliku / bufora w ikonie proxy. Dzięki temu te programy oparte na tty mogą być bardziej zintegrowane z otaczającym systemem operacyjnym.

Zachowania katalogu roboczego są domyślnie włączone dla bash (domyślna powłoka w Mac OS X). Odpowiedni kod znajduje się w / etc / bashrc.

Warto również wspomnieć, że Lion Terminal obsługuje teraz ustawianie tytułu karty niezależnie od tytułu okna za pomocą sekwencji ucieczki OSC.

Chris Page
źródło
update_terminal_cwdFunkcja będzie ustawiona ikonę proxy do bieżącego katalogu roboczego. Domyślnie $PROMPT_COMMANDjest update_terminal_cwd.
jtbandes
@jtbandes Do tego właśnie miałem na myśli, kiedy napisałem: „Zachowania w katalogu roboczym są domyślnie włączone dla bash…”.
Chris Page
Tak. Właśnie odkryłem, jak to działa i pomyślałem, że może być przydatny dla przyszłych pracowników Google!
jtbandes
3

Oprócz zalecania używania sekwencji ucieczki poleceń systemu operacyjnego specyficznej dla terminala Apple: ESC ] Ps ; Pt BELgdzie Psjest 7i Ptjest file:adresem URL; warto dodać, że w Mac OS X 10.11 (i prawdopodobnie od 10.7) jest plik /etc/bashrc_Apple_Terminal(nieedytowalny pod 10.11), który definiuje wygodę update_terminal_cwd()jako (bez komentarzy):

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

Możesz użyć tego również na zdalnych skrzynkach, na wypadek, gdybyś chciał to zrobić, a następnie podrapać się po poprawnym zakodowaniu adresu URL pliku w bash.

A jeśli zmienisz PROMPT_COMMANDsię sam .bash_profilelub .bashrczapomnisz to nazwać. W tym samym pliku pokazują przykład lepszego połączenia łańcuchowego za pomocą:

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

Osobiście .bash_profilechciałem dodać polecenie git, więc zrobiłem to:

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
źródło
1

Rozwiązania Bash obejmujące PS1 i PROMPT_COMMAND kończą się niepowodzeniem, jeśli katalog zawiera znaki Unicode (przynajmniej w systemie Snow Leopard). Najlepszym rozwiązaniem, jakie mogłem wymyślić, było zrobienie odpowiednika

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

Niestety nie działa to bezpośrednio, więc zamiast tego zdefiniowałem funkcję powłoki, aby wykonać trwywołanie:

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

Działa to dobrze w przypadku akcentów łacińskich, które będą w formacie Unicode NFD (akcenty znikną, ale pozostanie podstawowa postać łacińska).

Niestety, całkowicie zawiedzie w przypadku takich rzeczy jak chiński.

Michael Norrish
źródło
Począwszy od systemu Mac OS X Lion 10.7, terminal ma jawną sekwencję zmiany znaczenia do ustawienia katalogu roboczego. Używa adresu URL, dzięki czemu można używać kodowania procentowego dla znaków specjalnych i obsługiwać wszystkie prawidłowe nazwy ścieżek. Szczegóły znajdują się w mojej odpowiedzi na to pytanie.
Chris Page
1

Zakładając, że używasz domyślnego terminala MAC, możesz użyć następującego w .profile, ponieważ sam „set_prompt” może wysłać cię do folderu głównego po otwarciu nowej karty:

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
źródło
0

Wpisz to do swojego ~ / .profile lub równoważnego pliku:

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

export PS1='\W \$ '

settitle `pwd`

Pierwszy wiersz zawiera dwa znaki specjalne, których nie można skopiować / wkleić, ale tekst można pobrać stąd: http://blog.nottoobadsoftware.com/files/setterminaltitle.sh .

Kareman
źródło
1
„Pierwszy wiersz zawiera dwa znaki specjalne, których nie można skopiować / wkleić” Zamiast echoużywania printf, co pozwala wyrazić te znaki (ESC i BEL / Control-G) za pomocą sekwencji ucieczki:printf '\e]0;$@\a"
Chris Page