อักขระตัวแรกของคำสั่งซ้ำบนจอแสดงผลเมื่อเสร็จสิ้น


21

สองตัวอักษรแรกซ้ำแล้วซ้ำอีกในขณะที่ฉันใช้Tabให้เสร็จ ในภาพหน้าจอด้านล่างcdซ้ำแล้วซ้ำอีก

ป้อนคำอธิบายรูปภาพที่นี่

ฉันลอง rxvt-unicdoe, xterm, terminator แล้ว เทอร์มินัลอีมูเลเตอร์ทั้งหมดมีปัญหานี้

Zsh เวอร์ชั่น 5.0.2, ไฟล์กำหนดค่าon-my-zsh


อักขระซ้ำ ๆ กันในคำสั่งที่ zsh เรียกใช้หรือแสดงเพียง? จำนวนตัวอักษรเปลี่ยนไปหรือไม่หากคำสั่งยาวกว่าสองอักขระ จำนวนเปลี่ยนแปลงเมื่อไดเรกทอรีปัจจุบันเปลี่ยนไปหรือไม่
Gilles 'SO- หยุดความชั่วร้าย'

@Gilles อักขระ char ซ้ำไม่มีอยู่ในคำสั่ง ฉันสามารถรันคำสั่ง
jilen

คำตอบ:


32

หากบางครั้งตัวอักษรในบรรทัดคำสั่งของคุณแสดงที่ออฟเซ็ตนี่เป็นเพราะ 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โดยค่าเริ่มต้น) จะแก้ไขได้


ฉันคิดว่าฉันอาจจะหายไปแบบอักษรที่เกี่ยวข้องฉันสังเกตเห็นตัวอักษรตัวแรกที่แปลก มันเป็นที่คาดว่าจะได้->ผมคิดว่า
jilen

@ jilen Ah นี่อาจเป็นอีกปัญหาหนึ่งที่ฉันลืมพูดถึง: บางทีพรอมต์ของคุณอาจมีอักขระที่ไม่ใช่ ASCII ในการเข้ารหัสที่แตกต่างจากเทอร์มินัลของคุณโดยการเข้ารหัสหนึ่งหรือทั้งสองแบบเป็นมัลติไบต์ หากคุณต้องการความช่วยเหลือให้โพสต์ผลลัพธ์ของlocaleและของecho $PS1 | od -t x1(และสิ่งเดียวกันกับตัวแปรอื่น ๆ ที่ใช้โดย$PS1)
Gilles 'หยุดความชั่วร้าย'

2
ฉันลืมที่จะตั้งสถานที่ (ฉันใช้ archlinux สถานที่ที่เหลือไม่ได้ตั้งค่าเริ่มต้น) หลังจากชุดโลแคลปัญหานี้ได้รับการแก้ไขแล้ว ขอบคุณมาก ๆ เลย !!!!
jilen

ฉัน upvoting เพราะดีมันสวยมาก แต่การหลีกเลี่ยงนั้นไม่จำเป็นต้องรวมอยู่ในวงเล็บหากคุณจัดการเคอร์เซอร์ด้วยตัวเอง การเรียกฟังก์ชั่น subshelled ทำงานให้ฉันในอดีต - หรือการเปลี่ยนเส้นทางที่ยังคงอยู่ใน / dev / tty โดยไม่เกี่ยวข้องกับ stdout อาจทำงานได้ วิธีอื่นที่ใช้งานได้ - ใช้\e{7,8}เพื่อบันทึก / กู้คืนสถานะเคอร์เซอร์
mikeserv

มันเป็นสิ่งLC_CTYPEที่แก้ไขได้สำหรับฉัน ฉันตั้งมันไว้Cเมื่อไม่ได้ตั้งค่าทุกอย่างทำงานได้ ขอบคุณ
jmaloney

14

ฉันมีปัญหาเดียวกันและพบว่าวิธีการแก้ปัญหาของฉันที่นี่: https://github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519 ~/.zshrcเพียงแค่ใส่ต่อไปนี้ลงของคุณ

export LC_CTYPE=en_US.UTF-8


1
ขอบคุณสำหรับคำใบ้ของคุณ! อย่างไรก็ตามฉันต้องรีเซ็ตทั้งหมดที่localeฉันใช้ แต่ใช้งานได้สำหรับฉัน คำตอบนี้ให้ขั้นตอนที่จำเป็นสำหรับ Ubuntu
สูงสุด

ขอบคุณมาก! ช่วยฉันให้รอดพ้นจากการถูกทรมานมาก
Moshe

1

ฉันมีปัญหานี้ใน iTerm 2 บน macOS ฉันสิ้นสุดการแก้ไขโดยไปที่การตั้งค่า -> โปรไฟล์ -> ข้อความและติ๊ก "ใช้ Unicode เวอร์ชัน 9 ความกว้าง"


ว้าวนี่ใช้งานได้จริง ขอบคุณ!
Paul Calabro

1

ฉันมีปัญหานี้โดยใช้ภาพ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.