Zsh Terminalini Sürdür (OS X Lion)


17

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?


Aşağıdaki cevaplar ile ilgili: terminal.app dizini haberdar etmek, aynı dizinde yeni terminalleri açmak için de yararlıdır
nhooyr

Yanıtlar:


18

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 .zshrceklenti 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.


1
Muhtemelen pratikte büyük bir şey değil, ama hisse senedi / etc / bashrc çift ​​tırnak chpwdgibi son satırı olduğunu görüyorum printf '\e]7;%s\a' "$PWD_URL". Bahşiş için teşekkürler.
Ryan McCuaig

Bu şimdi oh-my- zsh'a doğru ilerliyor (bkz. Github.com/robbyrussell/oh-my-zsh/pull/522 ). Zshrc'nizdeki osx eklentisini açtığınızdan emin olmanız gerekir.
Ryan McCuaig

2
Ayrıca bu kodun yalnızca boşlukları yüzde olarak kodladığını unutmayın. Bonus puanlar için, tüm yasadışı URL karakterlerini yüzde olarak kodlayın (ve herhangi bir program çağırmadan bunu yapıp yapamayacağınızı görün). Geçerli tüm yol adlarıyla çalışmasını istiyorsanız bu önemlidir. Ayrıca, bazı karakterler kaçış dizilerinin bir parçası olarak bile kabul edilmez, bu yüzden onları terminale almak için yüzde kodlaması gerekir. Bunu bash için yapabildim, ama zsh ile test etmeyi denemedim.
Chris Page

1
Yol adının sıkıştırılmasını önlemek için "$ PWD_URL" etrafındaki tırnak işaretleri gerekir. EDIT: Bu bash için gereklidir, ancak zsh için isteğe bağlıdır. Tırnakları tutarlı bir şekilde kullanmayı tercih ederim, böylece taşınabilir.
Chris Page

Teşekkürler Ryan, Chris. Tutarlılık için çift tırnak kullanmak için komut dosyasını güncelledim.
captainpete

27

İş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_ALLGeçersiz kılmaması için boş olarak ayarlayın LC_CTYPE. precmdÇalışma dizinini, her chpwddeğ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 -vaçı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

Teşekkürler, kabul edilen çözüm benim için işe yaramadı, ama bu işe yarıyor.
eelco

Bu da benim için çalışıyor.
sikachu

4
Ayrıca, bu çözümün zaten oh-my-zsh'de olduğuna dikkat edilmelidir , sadece terminalappeklentiyi etkinleştirin .
Simon

1
Sadece açık söylemek gerekirse, @Simon , bu cevabın yazıldığı günden bu yana artık oh-my-zsh içinde olduğu anlamına geliyor .
Chris Page

Doğru @ChrisPage, belirsiz ifadeler için özür dilerim (ingilizce benim ana dilim değil). Söylemek istediğim sadece şuydu, bunu kendinize .zprofileveya 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.
Simon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.