OS X Lion "Devam Et" özelliğine sahiptir, yani bir uygulamayı yeniden açtığınızda tüm pencereleri ve içeriklerini geri yükler. Bu Terminal için de geçerli. Ancak Bash yerine Zsh kullanırsanız, açık dizini geri yüklemez. Bunu nasıl düzeltebilirim?
OS X Lion "Devam Et" özelliğine sahiptir, yani bir uygulamayı yeniden açtığınızda tüm pencereleri ve içeriklerini geri yükler. Bu Terminal için de geçerli. Ancak Bash yerine Zsh kullanırsanız, açık dizini geri yüklemez. Bunu nasıl düzeltebilirim?
Yanıtlar:
GÜNCELLEME : Bu, yorumlarda belirtilen nedenlerden dolayı tamamen doğru değildir. Aşağıdaki cevabı kullanın . Ekstra yol kat ettiğin için teşekkürler @ChrisPage :)
Bu sorunun cevabı, tersine mühendislik ile bash'ın bunu nasıl yaptığıyla bulunabilir /etc/bashrc
. Ağın etrafında birçok yaklaşım denedim ama Apple'ın yolu en iyi şekilde çalışıyor gibi görünüyor (şekil).
Senin içinde .zshrc
eklenti aşağıdaki
# 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
}
Mutlu devam ediyor.
Açıklığa kavuşturmak için, bu cevap OS X Lion's Terminal.app tercihlerindeki gizemli mesajla ilgilidir:
** Programlar çıkış dizilerini kullanarak geçerli çalışma dizininin Terminalini bildirir. Bu davranışı etkinleştirmek için kabuğunuzu veya diğer programları yapılandırmanız gerekebilir. *
Bu yanıt, kabuk olarak zsh kullandığınızda işe yarar. Bash için Terminal Özgeçmişi zaten Apple tarafından uygulanmıştır.
chpwd
gibi son satırı olduğunu görüyorum printf '\e]7;%s\a' "$PWD_URL"
. Bahşiş için teşekkürler.
İşte / etc / bashrc'yi zsh için uyarlamam. Bunu gerektiren tüm URL karakterlerinin yüzde kodlamasını ekledim. Bu, geçerli tüm dosya ve dizin adlarıyla çalışmasını istiyorsanız önemlidir.
Bu precmd
, birden fazla işlevin diğer komut dosyalarına ve yapılandırma dosyalarına kaydedilmesini sağlayan bir kanca kaydeder.
GÜNCELLEME Mart 2019: LC_ALL
Geçersiz kılmaması için boş olarak ayarlayın LC_CTYPE
. precmd
Çalışma dizinini, her chpwd
değiştirilişinde güncellemek yerine her komut isteminde güncellemek için kullanın ; komut boru hatları geçici olarak değiştirebilir ve terminalde bunları görüntülememelidir. Ayrıca, her komut isteminin önceki komut sırasında değiştirilmesi durumunda terminal durumunu güncellemesi yararlı olabilir. Kullanım printf -v
açıkça değişkenin yerine altkabuk sözdizimi kullanarak yazma.
# 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
eklentiyi etkinleştirin .
.zprofile
veya herhangi bir şeye yapıştırmanıza gerek yok , aslında var olduğunu fark etmeden önce yaptığım gibi oh-my-zsh
. Aynı çözüm fiil ve tüm krediyi hak ediyorsun.