วิธีที่ดีกว่าในการอ่านบรรทัดอินพุตของผู้ใช้ใน zsh? (เช่นกับ zle?)


11

Zsh's readด้วยเหตุผลบางอย่างก็คือ echo'ing ^M's แทนการยอมรับพวกเขาเป็น<Enter>keystrokes (หาก-dตั้งไว้พวกมันจะถูกจดจำว่าเป็น<Enter>แต่ก็ยังคงดังก้องอยู่) และมันก็ไม่รองรับพื้นฐานเช่นปุ่ม Backspace

ฉันจะได้รับรอบนี้โดยแฮ็ค / ทำงานbash,

> a=$(bash -c 'read -e -p "What would you like to do?: " tmp; echo $tmp')
What would you like to do?: eat cake
> echo $a                                                                
eat cake

แต่ฉันสงสัยว่ามีวิธีที่สะอาดกว่านี้ไหม


ไม่สามารถยืนยันการzshติดตั้ง 4.3.10 ใหม่ได้ % read aทำงานได้ดีที่นี่
user1686

นี่คือการใช้ iterm บน OS X; readทำงานบนเครื่อง Linux
นิโคลัสตุง

คำตอบ:


19

เพื่อป้อนบรรทัดของข้อความสะดวกสบายภายใต้ zsh varedใช้ ใช้varedแทนการreadเรียกใช้zleซึ่งเทียบเท่ากับการผ่าน-eใน bash เพื่อเรียกใช้ readline

vared -p 'What would you like to do?: ' -c tmp

พฤติกรรมที่คุณอธิบายด้วยreadหน้าตาธรรมดาดูเหมือนเทอร์มินัลที่กำหนดค่าผิดพลาดแทนที่จะเป็นปัญหาเชลล์ เรียกใช้stty -aเพื่อแสดงการตั้งค่าเทอร์มินัลของคุณและตรวจสอบให้แน่ใจว่าeolได้ตั้งค่า^Mและeraseตั้งค่าเป็นBackspaceคีย์ของคุณ ทั้งนี้ขึ้นอยู่กับระบบปฏิบัติการและวิธีการที่จะตั้งค่าและใน terminal, Backspaceส่งอย่างใดอย่างหนึ่งหรือ^H ^?การตั้งค่า backspace มักจะผิดเนื่องจากไฟล์การกำหนดค่าบางอย่างที่พยายามตั้งค่าด้วยตนเองดังนั้นสิ่งแรกที่คุณควรทำคือติดตามและลบการตั้งค่าผิดพลาดใด ๆ หากคุณไม่พบเลยให้ตรวจสอบการตั้งค่าเทอร์มินัลอีมูเลเตอร์ของคุณเพื่อตรวจสอบว่าไม่ได้ตั้งค่าในโหมดความเข้ากันได้ในอดีตบางโหมด หากสิ่งอื่นล้มเหลวให้เพิ่มสิ่งนี้ในของคุณ~/.zshrc:

if [[ $(ps -o comm= $PPID) = iterm ]]; then
  stty erase '^?'
fi

1
vared -p 'คุณต้องการทำอะไร?:' -c tmp
zzapper

เจ๋ง! ไม่รู้เรื่องvaredตัวอาคาร กลับกลายเป็นว่าzshzleหน้าคนมีค่าอย่างน้อย skimming ผ่านอย่างแน่นอน
ratijas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.