วางไดเรกทอรีทำงาน“ canonical” ลงในพร้อมท์ zsh บน OS X (iTerm 2 หากมีความสำคัญ)


0

ฉันใช้ zsh และ oh-my-zsh สำหรับสภาพแวดล้อมเชลล์ใน OS X และฉันมีเวลาที่ยากลำบากในการติดตามหรือไม่ว่าสิ่งที่เกิดขึ้นเป็นผลมาจากฟังก์ชั่น oh-my-zsh หรือพฤติกรรมเริ่มต้น ของ zsh; มันเป็นเรื่องของเครื่องสำอางทั้งหมด แต่มันทำให้ฉันเป็นบ้า

รุ่นสั้น ๆ ว่าถ้าผมcdในไดเรกทอรีสิ่งที่ถูกพิมพ์ในพรอมต์ของฉันจากการ%cเป็นว่าอาร์กิวเมนต์ที่ถูกส่งผ่านไปยังcd; ดังนั้นถ้าฉันเปลี่ยนเป็น "test" ในไดเรกทอรี แต่ฉันสะกดว่า "tEst" โดยไม่ได้ตั้งใจ "tEst" คือสิ่งที่จะปรากฏในพรอมต์ของฉัน มันน่ารำคาญมาก

อีกตัวอย่างของที่มันโผล่ขึ้นมาคือเมื่อฉันใช้ฟังก์ชั่นเปลือกนี้ (ลดความซับซ้อนจากBrett Terpstra )

cdf()
 {
   target=`osascript -e 'tell application "Finder" to get POSIX path of (target of front Finder window as text)'`
   cd ${target}
 }

เมื่อฉันใช้ฟังก์ชั่นนี้ไม่ว่าฉันจะอยู่ในไดเรกทอรีใดไดเรกทอรีการทำงานของฉันก็จะปรากฏขึ้น~targetในทันที

อย่างที่ฉันบอกว่านี่เป็นปัญหาด้านเครื่องสำอางอย่างสมบูรณ์ แต่มันทำให้ฉันบ้า นี่คือสิ่ง zsh สิ่งที่ oh-my-zsh หรือมีการขยายตัวอื่นที่ฉันสามารถใช้ในการตั้งค่าพรอมต์ของฉันที่จะแก้ไขปัญหานี้หรือไม่ ฉันใช้ iTerm 2 แต่ฉันได้ลองใช้งานใน Terminal.app และมีสิ่งเดียวกันเกิดขึ้น


มันทำงานได้ดีขึ้นในฐานะ% 1 ~ แทนที่จะเป็น% c หรือไม่
Bradd Szonye

@BraddSzonye ทำงานแบบเดียวกันทุกประการ
Doug Stephen

หืมอะไรที่$PWDดูเหมือนว่าเมื่อคุณcdเข้าไปในไดเรกทอรีเหล่านี้? คุณอาจสามารถใช้สิ่งนั้นแทนที่จะแสดง%cในพรอมต์ของคุณบางทีหลังจากการประมวลผลการทดแทนเชลล์
Bradd Szonye

@BraddSzonye echo $PWDคายเหมือนกัน: - /
Doug Stephen

ตกลงนั่นไม่ถูกต้อง ฉันมีความคิดให้ฉันทำวิจัยเพิ่มเติมเล็กน้อยเมื่อฉันอยู่ที่กล่อง Unix ของฉัน
Bradd Szonye

คำตอบ:


2

คำถามสองส่วนของคุณมีความละเอียดต่างกัน

cd TEst

พฤติกรรมนี้เป็นผลมาจากการโต้ตอบของสองนิสัยใจคอ:

  • OS X ใช้ระบบไฟล์แบบไม่ตรงตามตัวพิมพ์ใหญ่ - ใหญ่โดยค่าเริ่มต้น
  • เชลล์ตั้งค่าPWDเป็น "ไดเร็กทอรีการทำงานปัจจุบันตามที่กำหนดโดยcdคำสั่ง" ซึ่งตรงข้ามกับพา ธ สัมบูรณ์ที่รายงานโดยการgetcwdเรียกระบบ

การเล่นโวหารหลังช่วยให้คุณใช้ symlink ราวกับว่าพวกเขาเป็นไดเรกทอรีปกติ ด้วยการจดจำเส้นทางที่คุณพิมพ์แทนเส้นทางสัมบูรณ์เชลล์จะให้คุณcd symlink... cd ..เพื่อกลับไปยังที่ที่คุณเริ่ม บนระบบไฟล์แบบคำนึงถึงขนาดตัวพิมพ์เช่นcd TEstตัวพิมพ์ใหญ่จะมีลักษณะเหมือนกับ symlinks ตั้งค่าPWDเป็นพา ธ ที่คุณพิมพ์แทนชื่อระบบไฟล์ของไดเรกทอรี

เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถใช้$(pwd -P)เพื่อรับพา ธ แบบบัญญัติตามที่รายงานโดยgetcwdแทนที่จะเป็นโลจิคัลพา ธ ของเชลล์ ระวังว่าสิ่งนี้มีผลข้างเคียงของการแก้ไข symlink ทั้งหมดในเส้นทาง วิธีเลียนแบบการ%cใช้งาน:$(basename $(pwd -P | sed "s#$HOME#~#"))

อีกวิธีหนึ่งคุณสามารถแปลงระบบไฟล์เป็นแบบตรงตามตัวพิมพ์ใหญ่ - เล็ก แต่แอปพลิเคชั่น OS X บางตัวเช่น Steam และ Photoshop เข้ากันไม่ได้

cd ${target}

ฉันไม่สามารถทำซ้ำพฤติกรรมนี้ใน OS X ด้วยธรรมดาzsh- อาจเป็นปัญหากับ oh-my-zsh หรือการกำหนดค่าของคุณ ในขณะที่คุณสามารถใช้$(pwd -P)วิธีแก้ปัญหาเดียวกันนี้สคริปต์และโปรแกรมอื่นอาจล้มเหลวหาก$PWDไม่สามารถแก้ไขเส้นทางที่ถูกต้อง หากคุณสามารถสร้างปัญหาขึ้นมาใหม่ด้วยการติดตั้ง oh-my-zsh น้อยที่สุดคุณควรรายงานข้อผิดพลาดต่อผู้ดูแล


เกี่ยวกับทั้ง${target}สิ่งนี้เป็นไม่เป็นปัญหาถ้าผมใช้ก็เพียงปัญหาถ้าผมใช้สิ่งที่ต้องการPWD %cแต่การใช้งานpwdในพรอมต์ของฉันแสดงเส้นทางทั้งหมดแทนที่จะเป็นแค่ชื่อของไดเรกทอรีปัจจุบัน ฉันชอบความรัดกุม%cแต่การใช้pwdอาจทนได้
Doug Stephen

ดังนั้นฉันจึงลงเอยด้วยการประนีประนอม ฉันไม่อยากกังวลมากเกี่ยวกับสิ่งที่ความไวกรณี แต่เพื่อที่จะแก้ไข${target}สิ่งที่ฉันได้ตัดสินใจที่จะใช้ต่อไปนี้ในพรอมต์ฉัน:$(basename `pwd` | sed 's/dstephen/\~/')
ดั๊กสตีเฟ่น

ทางออกที่ดี ฉันจะเพิ่มชื่อเบสและชิ้นส่วน sed ในคำตอบของฉันเนื่องจากมันใกล้เคียงกับ% c หากคุณไม่สนใจเรื่องการ~เปลี่ยนทดแทนคุณสามารถทำให้มันง่ายขึ้นไปที่:${PWD##*/}
Bradd Szonye

น่ากลัว ฉันชอบการ~แทนที่และฉันออกจาก-Pตัวเลือกเพราะบางครั้ง symlink ของฉันไม่มีชื่อเหมือนกับที่ลิงก์ (ชื่อที่ดีทางความหมายสำหรับไดเรกทอรีที่น่าเกลียด) ไปที่และฉันต้องการให้ชื่อ symlinked ปรากฏในพรอมต์
Doug Stephen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.