Zsh- टर्मिनल (OS X शेर) फिर से शुरू करें


17

OS X Lion में "रिज्यूमे" सुविधा है, यानी जब आप किसी ऐप को दोबारा खोलते हैं तो यह सभी विंडो और उनकी सामग्री को पुनर्स्थापित करता है। जो टर्मिनल के लिए भी काम करता है। लेकिन अगर आप बैश के बजाय Zsh का उपयोग करते हैं तो यह खोली गई निर्देशिका को पुनर्स्थापित नहीं करता है। मैं इसे कैसे ठीक करूं?


उत्तर देने के लिए संबंधित नीचे: terminal.app निर्देशिका के बारे में पता कर रही है भी मौजूदा एक के रूप में एक ही निर्देशिका में नया टर्मिनल खोलने के लिए उपयोगी है
nhooyr

जवाबों:


18

अद्यतन : टिप्पणियों में उल्लिखित कारणों से यह पूरी तरह से सही नहीं है। नीचे दिए गए उत्तर का उपयोग करें । धन्यवाद @ क्रिस मिल अतिरिक्त मील जाने के लिए :)

इसका उत्तर रिवर्स इंजीनियरिंग द्वारा पाया जा सकता है कि यह किस तरह से टकराता है /etc/bashrc। मैंने नेट के आस-पास से कई तरीकों की कोशिश की, लेकिन लगता है कि Apple का तरीका सबसे अच्छा काम करता है।

अपने .zshrcऐड में निम्नलिखित

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

मुबारक हो फिर से शुरू

स्पष्ट करने के लिए, यह उत्तर OS X Lion के Terminal.app वरीयताओं में रहस्यमय संदेश से संबंधित है:

** कार्यक्रम बच अनुक्रमों का उपयोग करके वर्तमान कार्य निर्देशिका के टर्मिनल को सूचित करते हैं। इस व्यवहार को सक्षम करने के लिए आपको अपने शेल या अन्य कार्यक्रमों को कॉन्फ़िगर करने की आवश्यकता हो सकती है। *

जब आप अपने शेल के रूप में zsh का उपयोग कर रहे हों तो यह उत्तर काम करता है। एप्पल द्वारा बैश के लिए टर्मिनल रिज्यूम पहले ही लागू किया जा चुका है।


1
व्यवहार में शायद नहीं एक बड़ी बात है, लेकिन मैं शेयर / etc / bashrc की अंतिम पंक्ति है, यह देखने chpwdके रूप में printf '\e]7;%s\a' "$PWD_URL"दोहरे उद्धरण चिह्नों के साथ। पारितोषिक के लिए धन्यवाद।
रयान मैककुआग

अब यह ओह-माय-ज़श ( github.com/robbyrussell/oh-my-zsh/pull/522 देखें ) में अपना रास्ता बना रहा है । आपको यह सुनिश्चित करने की आवश्यकता होगी कि आपने अपने zshrc में osx प्लगइन चालू किया है।
रयान मैककुआग 17

2
यह भी ध्यान दें कि यह कोड केवल प्रतिशत-एन्कोड करता है। बोनस अंक के लिए, इसे सभी अवैध URL वर्णों को एनकोड करें (और देखें कि क्या आप इसे बिना किसी प्रोग्राम को लागू किए बिना कर सकते हैं)। यह महत्वपूर्ण है यदि आप चाहते हैं कि यह सभी वैध मार्ग के साथ काम करे। इसके अलावा, कुछ पात्रों को एस्केप सीक्वेंस का हिस्सा भी नहीं माना जाता है, इसलिए उन्हें टर्मिनल पर लाने के लिए प्रतिशत-एन्कोडिंग की आवश्यकता होती है। मैं बैश के लिए ऐसा करने में सक्षम था, लेकिन मैंने इसे zsh के साथ जांचने की कोशिश नहीं की।
क्रिस पेज

1
"$ PWD_URL" के आस-पास के उद्धरणों को पथनाम को मूंग किए जाने से रोकने के लिए आवश्यक है। EDIT: यह bash में आवश्यक है, लेकिन zsh में वैकल्पिक है। मैं लगातार उद्धरणों का उपयोग करना पसंद करता हूं इसलिए यह पोर्टेबल है।
क्रिस पेज

धन्यवाद रयान, क्रिस। मैंने निरंतरता के लिए दोहरे उद्धरण चिह्नों का उपयोग करने के लिए स्क्रिप्ट को अपडेट किया है।
कप्तान 21

27

यहाँ zsh के लिए / etc / bashrc का मेरा अनुकूलन है। मैंने सभी URL वर्णों के प्रतिशत-एन्कोडिंग को शामिल किया है जिनकी आवश्यकता है, जो कि यदि आप चाहते हैं कि यह सभी मान्य फ़ाइल और निर्देशिका नामों के साथ काम करे।

यह एक precmdहुक को पंजीकृत करता है , जो एक से अधिक फ़ंक्शन को अन्य स्क्रिप्ट और कॉन्फ़िगरेशन फ़ाइलों में पंजीकृत करने की अनुमति देता है।

अद्यतन मार्च 2019: LC_ALLखाली करने के लिए सेट करें ताकि यह ओवरराइड न हो LC_CTYPE। का प्रयोग करें precmdउपयोग करने के बजाय प्रत्येक प्रॉम्प्ट पर काम कर निर्देशिका अद्यतन करने के लिए chpwdयह हर बार यह है बदल-आदेश पाइपलाइनों यह अस्थायी रूप से बदल सकते हैं और टर्मिनल उन प्रदर्शित नहीं करना चाहिए अद्यतन करने के लिए। साथ ही, पिछली स्थिति के दौरान इसे बदले जाने की स्थिति में टर्मिनल स्थिति को अद्यतन करने के लिए यह उपयोगी हो सकता है। printf -vसबटाइटल सिंटैक्स का उपयोग करने के बजाय चर को स्पष्ट रूप से लिखने के लिए उपयोग करें ।

# 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

धन्यवाद, स्वीकृत समाधान मेरे काम नहीं आया, लेकिन यह करता है।
eelco

यह मेरे लिए भी काम कर रहा है।
सिचू

4
यह भी ध्यान दिया जाना चाहिए कि यह समाधान पहले से ही ओह-माय-ज़श में है , बस terminalappप्लगइन को सक्रिय करें ।
साइमन

1
बस स्पष्ट होने के लिए, @Simon का मतलब यह अब ओह-माय-ज़श में है, क्योंकि इस उत्तर को लिखा गया था।
क्रिस पेज

यह सही है @ क्रिसपज, मैं अस्पष्ट फगिंग के लिए माफी मांगता हूं (अंग्रेजी मेरी मातृभाषा नहीं है)। मेरे कहने का मतलब सिर्फ इतना था कि, आपको अपने .zprofileया जो भी है, उसे चिपकाने की जरूरत नहीं है , जैसा कि मैंने महसूस करने से पहले किया था कि यह वास्तव में उपलब्ध है oh-my-zsh। यह ठीक उसी समाधान में निहित है और आप सभी क्रेडिट के हकदार हैं।
साइमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.