Zsh-Terminal กลับมาทำงาน (OS X Lion)


17

OS X Lion มีคุณสมบัติ "ดำเนินการต่อ" เช่นเมื่อคุณเปิดแอปอีกครั้งแอปจะเรียกคืนหน้าต่างและเนื้อหาทั้งหมด ใช้งานได้กับ Terminal เช่นกัน แต่ถ้าคุณใช้ Zsh แทน Bash มันจะไม่คืนค่าไดเรกทอรีที่เปิด ฉันจะแก้ไขสิ่งนี้ได้อย่างไร


ที่เกี่ยวข้องกับคำตอบด้านล่าง: ทำให้ terminal.app ตระหนักถึงไดเรกทอรีนี้ยังมีประโยชน์สำหรับการเปิดเทอร์มินัลใหม่ในไดเรกทอรีเดียวกันกับหนึ่งในปัจจุบัน
nhooyr

คำตอบ:


18

ปรับปรุง : นี่ไม่ถูกต้องทั้งหมดด้วยเหตุผลที่กล่าวถึงในความคิดเห็น ใช้คำตอบดังต่อไปนี้ ขอบคุณ @ChrisPage สำหรับการเพิ่มไมล์ :)

คำตอบสามารถพบได้โดยวิศวกรรมย้อนกลับวิธีทุบตีมัน/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
}

มีความสุขกลับมาทำงานต่อ

เพื่อความกระจ่างแจ้งคำตอบนี้เกี่ยวข้องกับข้อความลึกลับในการตั้งค่าของ Terminal Xapp ของ OS X Lion:

** โปรแกรมแจ้งเตือนเทอร์มินัลของไดเรกทอรีการทำงานปัจจุบันโดยใช้ลำดับการหลีกเลี่ยง คุณอาจต้องกำหนดค่าเชลล์หรือโปรแกรมอื่นเพื่อเปิดใช้งานลักษณะการทำงานนี้ *

คำตอบนี้ใช้ได้เมื่อคุณใช้ zsh เป็นเปลือกของคุณ Apple Resume สำหรับทุบตีได้ดำเนินการแล้วโดย Apple


1
อาจไม่ใช่เรื่องใหญ่ในทางปฏิบัติ แต่ฉันเห็นหุ้น / etc / bashrc มีบรรทัดสุดท้ายchpwdเหมือนกับprintf '\e]7;%s\a' "$PWD_URL"เครื่องหมายคำพูดคู่ ขอบคุณสำหรับทิป.
Ryan McCuaig

ตอนนี้กำลังเข้าสู่ oh-my-zsh (ดูgithub.com/robbyrussell/oh-my-zsh/pull/522 ) คุณจะต้องตรวจสอบให้แน่ใจว่าคุณได้เปิดปลั๊กอิน osx ใน zshrc ของคุณ
Ryan McCuaig

2
โปรดทราบว่ารหัสนี้มีการเข้ารหัสช่องว่างเป็นเปอร์เซ็นต์เท่านั้น สำหรับคะแนนโบนัสให้เข้ารหัสเป็นเปอร์เซ็นต์อักขระ URL ที่ผิดกฎหมายทั้งหมด (และดูว่าคุณสามารถทำได้โดยไม่ต้องเรียกใช้โปรแกรมใด ๆ ) นี่เป็นสิ่งสำคัญหากคุณต้องการให้มันทำงานกับชื่อพา ธ ที่ถูกต้องทั้งหมด นอกจากนี้ตัวละครบางตัวยังไม่ถือว่าเป็นส่วนหนึ่งของลำดับการหลีกเลี่ยงดังนั้นการเข้ารหัสแบบเปอร์เซ็นต์จึงจำเป็นต้องนำพวกเขาไปที่เครื่องปลายทาง ฉันสามารถทำเช่นนี้เพื่อทุบตี แต่ฉันไม่ได้ลองทดสอบด้วย zsh
Chris Page

1
ต้องใส่เครื่องหมายอัญประกาศรอบ "$ PWD_URL" เพื่อป้องกันชื่อพา ธ ไม่ให้ถูก munged แก้ไข: นี่เป็นสิ่งจำเป็นในทุบตี แต่เป็นตัวเลือกใน zsh ฉันชอบที่จะใช้คำพูดอย่างสม่ำเสมอดังนั้นมันจึงพกพาได้
Chris หน้า

ขอบคุณไรอันคริส ฉันได้อัปเดตสคริปต์เพื่อใช้เครื่องหมายคำพูดคู่เพื่อความสอดคล้อง
captainpete

27

นี่คือการปรับ / etc / bashrc สำหรับ zsh ของฉัน ฉันได้รวมการเข้ารหัสอักขระ URL ทั้งหมดที่จำเป็นต้องใช้เป็นเปอร์เซ็นต์ซึ่งเป็นสิ่งสำคัญหากคุณต้องการให้สิ่งนี้ทำงานกับชื่อไฟล์และไดเรกทอรีที่ถูกต้องทั้งหมด

นี่เป็นการลงทะเบียนprecmdhook ซึ่งอนุญาตให้มีการลงทะเบียนมากกว่าหนึ่งฟังก์ชั่นในสคริปต์และไฟล์การกำหนดค่าอื่น ๆ

ปรับปรุงมีนาคม 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

อันนี้ใช้ได้สำหรับฉันเช่นกัน
sikachu

4
ควรสังเกตว่าโซลูชันนี้มีอยู่ในoh-my-zshเพียงเปิดใช้งานterminalappปลั๊กอิน
Simon

1
เพียงเพื่อให้ชัดเจน @Simon หมายความว่าตอนนี้อยู่ใน oh-my-zsh เพิ่มตั้งแต่คำตอบนี้ถูกเขียน
Chris หน้า

นั่นคือ @ChrisPage ที่ถูกต้องฉันขอโทษสำหรับถ้อยคำที่คลุมเครือ (ภาษาอังกฤษไม่ใช่ภาษาแม่ของฉัน) สิ่งที่ฉันหมายถึงว่าเป็นเพียงแค่ว่าคุณไม่จำเป็นต้องวางในของคุณหรืออะไรก็ตามเช่นผมก่อนที่จะทราบว่ามันอยู่ในความเป็นจริงในการใช้ได้.zprofile oh-my-zshมันอยู่ในโฉนดโซลูชั่นเดียวกันที่แน่นอนและคุณสมควรได้รับเครดิตทั้งหมด
Simon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.