OS X Lion ma funkcję „Wznów”, tzn. Po ponownym otwarciu aplikacji przywraca wszystkie okna i ich zawartość. To działa również w Terminalu. Ale jeśli użyjesz Zsh zamiast Bash, nie przywróci on otwartego katalogu. Jak mogę to naprawić?
OS X Lion ma funkcję „Wznów”, tzn. Po ponownym otwarciu aplikacji przywraca wszystkie okna i ich zawartość. To działa również w Terminalu. Ale jeśli użyjesz Zsh zamiast Bash, nie przywróci on otwartego katalogu. Jak mogę to naprawić?
Odpowiedzi:
AKTUALIZACJA : Nie jest to całkowicie poprawne, z powodów wymienionych w komentarzach. Skorzystaj z odpowiedzi poniżej . Dzięki @ChrisPage za włożenie dodatkowej mile :)
Odpowiedź można znaleźć za pomocą inżynierii odwrotnej, w jaki sposób bash to robi /etc/bashrc
. Próbowałem wielu podejść z całej sieci, ale sposób Apple wydaje się działać najlepiej (idź rysunek).
W swoim .zshrc
dodaj następujące
# Set Apple Terminal.app resume directory
if [[ $TERM_PROGRAM == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]] {
function chpwd {
local SEARCH=' '
local REPLACE='%20'
local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"
printf '\e]7;%s\a' "$PWD_URL"
}
chpwd
}
Happy wznowienia.
Dla wyjaśnienia, ta odpowiedź dotyczy tajemniczej wiadomości w preferencjach Terminal.app systemu OS X Lion:
** Programy powiadamiają terminal o bieżącym katalogu roboczym za pomocą sekwencji specjalnych. Może być konieczne skonfigurowanie powłoki lub innych programów, aby włączyć to zachowanie. *
Ta odpowiedź działa, gdy używasz zsh jako powłoki. Wznowienie terminalu dla bash zostało już zaimplementowane przez Apple.
chpwd
jak printf '\e]7;%s\a' "$PWD_URL"
w przypadku podwójnych cudzysłowów. Dzięki za wskazówkę.
Oto moja adaptacja / etc / bashrc dla zsh. Podałem kodowanie procentowe wszystkich znaków URL, które tego wymagają, co jest ważne, jeśli chcesz, aby działało ze wszystkimi prawidłowymi nazwami plików i katalogów.
To rejestruje precmd
przechwycenie, które pozwala zarejestrować więcej niż jedną funkcję w innych skryptach i plikach konfiguracyjnych.
ZAKTUALIZOWANY Marzec 2019: Ustaw LC_ALL
na pusty, aby nie zastępował LC_CTYPE
. Służy precmd
do aktualizowania katalogu roboczego przy każdym pytaniu zamiast chpwd
do aktualizowania go za każdym razem, gdy jest zmieniany - potoki poleceń mogą go tymczasowo zmienić i terminal nie powinien ich wyświetlać. Pomocne może być również zaktualizowanie stanu terminala w przypadku każdego monitu na wypadek, gdyby został on zmieniony podczas poprzedniego polecenia. Służy printf -v
do jawnego zapisu do zmiennej zamiast używania składni podpowłoki.
# Tell the terminal about the working directory whenever it changes.
if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]]; then
update_terminal_cwd() {
# Identify the directory using a "file:" scheme URL, including
# the host name to disambiguate local vs. remote paths.
# Percent-encode the pathname.
local url_path=''
{
# Use LC_CTYPE=C to process text byte-by-byte. Ensure that
# LC_ALL isn't set, so it doesn't interfere.
local i ch hexch LC_CTYPE=C LC_ALL=
for ((i = 1; i <= ${#PWD}; ++i)); do
ch="$PWD[i]"
if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
url_path+="$ch"
else
printf -v hexch "%02X" "'$ch"
url_path+="%$hexch"
fi
done
}
printf '\e]7;%s\a' "file://$HOST$url_path"
}
# Register the function so it is called at each prompt.
autoload add-zsh-hook
add-zsh-hook precmd update_terminal_cwd
fi
terminalapp
wtyczkę.
.zprofile
czy cokolwiek innego, tak jak to zrobiłem, zanim zdałem sobie sprawę, że w rzeczywistości jest dostępny oh-my-zsh
. Jest to dokładnie to samo rozwiązanie i zasługujesz na uznanie.