สองตัวอักษรแรกซ้ำแล้วซ้ำอีกในขณะที่ฉันใช้Tabให้เสร็จ ในภาพหน้าจอด้านล่างcd
ซ้ำแล้วซ้ำอีก
ฉันลอง rxvt-unicdoe, xterm, terminator แล้ว เทอร์มินัลอีมูเลเตอร์ทั้งหมดมีปัญหานี้
Zsh เวอร์ชั่น 5.0.2, ไฟล์กำหนดค่าon-my-zsh
สองตัวอักษรแรกซ้ำแล้วซ้ำอีกในขณะที่ฉันใช้Tabให้เสร็จ ในภาพหน้าจอด้านล่างcd
ซ้ำแล้วซ้ำอีก
ฉันลอง rxvt-unicdoe, xterm, terminator แล้ว เทอร์มินัลอีมูเลเตอร์ทั้งหมดมีปัญหานี้
Zsh เวอร์ชั่น 5.0.2, ไฟล์กำหนดค่าon-my-zsh
คำตอบ:
หากบางครั้งตัวอักษรในบรรทัดคำสั่งของคุณแสดงที่ออฟเซ็ตนี่เป็นเพราะ zsh คำนวณความกว้างผิดสำหรับพรอมต์ อาการคือจอแสดงผลดูดีตราบใดที่คุณเพิ่มอักขระหรือย้ายอักขระตามตัวอักษร แต่จะอ่านไม่ออก (มีอักขระบางตัวปรากฏขึ้นไกลเกินกว่าที่ควรจะเป็น) เมื่อคุณใช้คำสั่งอื่นที่ย้ายเคอร์เซอร์ ( Homeเสร็จสมบูรณ์ ฯลฯ ) ) หรือเมื่อคำสั่งทับซ้อนบรรทัดที่สอง
Zsh จำเป็นต้องทราบความกว้างของพรอมต์เพื่อที่จะทราบว่าวางอักขระของคำสั่งไว้ที่ใด มันสมมติว่าตัวละครแต่ละตัวครองตำแหน่งเดียวเว้นแต่จะบอกเป็นอย่างอื่น
ความเป็นไปได้อย่างหนึ่งคือพรอมต์ของคุณมีลำดับการหลีกซึ่งไม่ได้ถูกคั่นอย่างถูกต้อง Escape sequences ที่เปลี่ยนสีหรือลักษณะการจัดรูปแบบอื่น ๆ ของข้อความหรือเปลี่ยนชื่อหน้าต่างหรือเอฟเฟกต์อื่น ๆ มีความกว้างเป็นศูนย์ พวกเขาจะต้องมีการรวมอยู่ในโครงสร้างเปอร์เซ็นต์การจัดฟัน %{…%}
โดยทั่วไปแล้วลำดับการหลบหนีเช่น%42{…%}
บอก zsh ให้สันนิษฐานว่าสิ่งที่อยู่ภายในเครื่องหมายปีกกากว้าง 42 ตัวอักษร
เพื่อตรวจสอบการตั้งค่าของคุณพร้อมท์ ( PS1
, PROMPT
หรือตัวแปรที่พวกเขาอ้างอิง) และให้แน่ใจว่าทุกลำดับหนี (เช่น\e[…m
การเปลี่ยนแปลงแอตทริบิวต์ของข้อความ - ทราบว่ามันอาจจะนำเสนอผ่านทางตัวแปรบางอย่างเช่น$fg[red]
) %{…%}
อยู่ภายใน เนื่องจากคุณใช้ oh-my-zsh ให้ตรวจสอบทั้งการตั้งค่าของคุณเองและคำจำกัดความที่คุณใช้จาก oh-my-zsh
ปัญหาเดียวกันเกิดขึ้นในทุบตี ลำดับมีศูนย์ความกว้างในพรอมต์\[…\]
จะต้องมีการปิดล้อม
ความเป็นไปได้อีกอย่างหนึ่งคือพรอมต์ของคุณมีอักขระที่ไม่ใช่ ASCII และ zsh (หรือแอปพลิเคชันอื่น ๆ ) และเทอร์มินัลของคุณมีแนวคิดที่แตกต่างกันว่ามันกว้างแค่ไหน สิ่งนี้สามารถเกิดขึ้นได้หากมีความไม่ตรงกันระหว่างการเข้ารหัสของเทอร์มินัลและการเข้ารหัสที่ประกาศไว้ในเชลล์และการเข้ารหัสสองรายการทำให้เกิดความกว้างที่แตกต่างกันสำหรับลำดับไบต์ที่แน่นอน โดยทั่วไปคุณอาจพบปัญหานี้เมื่อใช้เทอร์มินัลที่ไม่ใช่ Unicode แต่ประกาศโลแคล Unicode หรือในทางกลับกัน
แอปพลิเคชันขึ้นอยู่กับตัวแปรสภาพแวดล้อมเพื่อทราบสถานที่ การตั้งค่าที่เกี่ยวข้องLC_CTYPE
ซึ่งจะถูกกำหนดจากตัวแปรสภาพแวดล้อมLANGUAGE
, LC_ALL
, LC_CTYPE
และLANG
(ครั้งแรกของเหล่านี้ที่เป็นชุดนำไปใช้) คำสั่งlocale | grep LC_CTYPE
จะบอกการตั้งค่าปัจจุบันของคุณ โดยปกติแล้ววิธีที่ดีที่สุดในการหลีกเลี่ยงปัญหาสถานที่เกิดเหตุคือการปล่อยให้เทอร์มินัลอีมูเลเตอร์ตั้งค่าLC_CTYPE
เพราะมันรู้ว่าการเข้ารหัสนั้นคาดหวังอะไรไว้ แต่ถ้านั่นไม่ได้ผลสำหรับคุณตรวจสอบให้แน่ใจว่าได้ตั้งค่าLC_CTYPE
แล้ว
อาการเดียวกันอาจเกิดขึ้นได้เมื่อคำสั่งก่อนหน้าแสดงผลลัพธ์บางอย่างที่ไม่ได้อยู่ในบรรทัดใหม่เพื่อให้พรอมต์แสดงขึ้นที่กึ่งกลางบรรทัด แต่เชลล์ไม่ได้ตระหนักถึงสิ่งนั้น ในกรณีนี้ที่จะเกิดขึ้นหลังจากรันคำสั่งดังกล่าวเท่านั้นไม่คงอยู่
หากบรรทัดไม่แสดงขึ้นอย่างถูกต้องคำสั่งredisplay
หรือclear-screen
(ผูกกับCtrl+ Lโดยค่าเริ่มต้น) จะแก้ไขได้
->
ผมคิดว่า
locale
และของecho $PS1 | od -t x1
(และสิ่งเดียวกันกับตัวแปรอื่น ๆ ที่ใช้โดย$PS1
)
\e{7,8}
เพื่อบันทึก / กู้คืนสถานะเคอร์เซอร์
LC_CTYPE
ที่แก้ไขได้สำหรับฉัน ฉันตั้งมันไว้C
เมื่อไม่ได้ตั้งค่าทุกอย่างทำงานได้ ขอบคุณ
ฉันมีปัญหาเดียวกันและพบว่าวิธีการแก้ปัญหาของฉันที่นี่: https://github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519 ~/.zshrc
เพียงแค่ใส่ต่อไปนี้ลงของคุณ
export LC_CTYPE=en_US.UTF-8
ฉันมีปัญหานี้ใน iTerm 2 บน macOS ฉันสิ้นสุดการแก้ไขโดยไปที่การตั้งค่า -> โปรไฟล์ -> ข้อความและติ๊ก "ใช้ Unicode เวอร์ชัน 9 ความกว้าง"
ฉันมีปัญหานี้โดยใช้ภาพ Ubuntu lts docker ( ubuntu:latest
) ฉันแก้ไขด้วยคำแนะนำที่มีให้ในหน้าเว็บที่เกี่ยวข้อง: https://hub.docker.com/_/ubuntu
apt-get update && \
apt-get install -y locales && \
rm -rf /var/lib/apt/lists/* && \
localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
echo 'export LANG=en_US.utf8' >> ~/.zshrc
zsh