ปุ่มโฮมทำหน้าที่แปลก ๆ ใน bash (tty และ X) กับสตริงอินพุตแบบยาว


11

เมื่อฉันกดHomeถ้าอินพุทปัจจุบันของฉันสั้นพอ (พูด, <36 ตัวอักษร) มันใช้งานได้ดี อย่างไรก็ตามเมื่อฉันพิมพ์คำสั่งที่ยาวขึ้นและต้องการกลับไปที่จุดเริ่มต้นดูเหมือนว่ามันจะทำงานได้ แต่คำสั่งจะไม่ปรากฏอีกต่อไป ดูเหมือนว่าฉันไม่ได้อยู่ในจุดเริ่มต้น แต่ปิดประมาณ 10 ตัวอักษร แม้ว่าฉันจะพิมพ์ "สุ่มสี่สุ่มห้า" ก็ใช้งานได้ดี แต่ดูเหมือนว่าจะเป็นระเบียบทั้งหมดราวกับว่าอินพุตทั้งหมดถูกเลื่อนไปทางขวา แต่ไม่ใช่การวาดใหม่ ดังนั้นฉันจึงพิมพ์ทับมัน แต่ "ไม่จริง" เพราะสถานที่ที่ฉัน "ลบ" คือ "จริง ๆ " อักขระ 10 ตัวทางขวา ดังนั้นถ้าฉันพยายามที่จะลบคำสั่งตัวอักษร 10 ตัวแรกจะยังคงปรากฏ แต่ถ้าฉันกดEnterมันก็จะแสดงข้อความแจ้งอีกครั้งราวกับว่าอินพุตก่อนหน้านี้ว่างเปล่า

ฉันรู้ว่ามันไม่ใช่คำอธิบายที่ดีที่สุดเท่าที่เคยมีมา แต่ประเด็นก็คือว่าการทุบตีจดจำและพยายามทำสิ่งที่ถูกต้อง แต่มักล้มเหลว

ฉันทำซ้ำทั้งใน tty และใน terminal ในเซสชั่น X เมื่อฉันกดCtrl+ Vแล้วHomeฉันเห็นลำดับที่แตกต่างกัน ( ^[OHใน X, เป็น^[[1~tty) แต่ทั้งคู่ดูเหมือนจะอยู่ใน/etc/inputrc:

# do not bell on tab-completion
#set bell-style none

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on

$if mode=emacs

# for linux console and RH/Debian xterm
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[7~": beginning-of-line
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word
"\e\e[C": forward-word
"\e\e[D": backward-word
"\e[1;5C": forward-word
"\e[1;5D": backward-word

# for rxvt
"\e[8~": end-of-line

# for non RH/Debian xterm, can't hurt for RH/DEbian xterm
"\eOH": beginning-of-line
"\eOF": end-of-line

# for freebsd console
"\e[H": beginning-of-line
"\e[F": end-of-line
$endif

echo $TERMแสดงlinuxใน tty และxtermX session

มัน

GNU ทุบตีรุ่น 4.2.24 (2) - ปล่อย (i686-pc-linux-gnu)

ใครมีเบาะแสเกี่ยวกับเรื่องนี้?


1
ข้อความแจ้งของคุณนานเท่าไร การพิมพ์บรรทัดคำสั่งยาวประมาณ 36 ตัวอักษรเติมหนึ่งบรรทัดในเทอร์มินัลของคุณหรือไม่และทำให้เกิดการเลื่อนด้านข้างหรือไม่? มันยังคงเกิดขึ้นถ้าคุณใช้พรอมต์นี้หรือไม่? PS1='$ '
มิเคล

@Mikel ฉันไม่รู้ว่าคุณมีอะไรอยู่ในใจ แต่คุณก็น่าจะใกล้เคียงที่สุด ดูเหมือนจะไม่เกิดขึ้นเมื่อฉันใช้การแจ้งเตือนแบบเรียบง่าย หนึ่งผมใช้เล็ก ๆ น้อย ๆ PS1="\e[0;36m[\u@\h \W]\$ \e[m"ก็แก้ไขเมื่อเทียบกับหนึ่งเริ่มต้น: มีอะไรผิดปกติกับมัน? การพิมพ์อักขระ 36 ตัวไม่เติมหนึ่งบรรทัด (โดยไกล) นอกจากนี้ผมไม่ได้มีด้านการเลื่อนใน TTY :)
เลฟ Levitsky

@Mikel ฉันทำตามคำแนะนำของ jw013 และปรับเปลี่ยนพรอมต์ที่ดูเหมือนว่าจะแก้ปัญหาได้ บางทีคุณอาจจะทำอย่างละเอียดในสิ่งที่เป็นปัญหาเพื่อที่ฉันจะตอบแทนคุณด้วยตัวแทนบางส่วนเป็นหนึ่งที่จะคิดออกครั้งแรก :)
เลฟ Levitsky

คำตอบ:


13

คุณจำเป็นต้องล้อมรอบส่วนที่ไม่ใช่การพิมพ์ของคุณพร้อมท์ (รวมถึง แต่ไม่ จำกัด เพียงการลำดับหนีสำหรับเปลี่ยนสี) ด้วยและ\[\]

พรอมต์ดั้งเดิมของคุณ: \e[0;36m[\u@\h \W]\$ \e[m
แก้ไขพรอมต์:\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]

\[และ\]บอกbashทุกอย่างที่อยู่ในระหว่างไม่จริงพิมพ์ไปยังหน้าจอคือมีความยาวเป็นศูนย์ ความยาวพรอมต์ที่คำนวณได้นั้นจำเป็นต้องรู้ว่าจะสะท้อนเสียงตัวอักษรที่คุณพิมพ์ การออกไป\[ \]ทำให้เกิดbashการคำนวณความยาวของพรอมต์ที่ไม่ถูกต้องซึ่งมักจะนำไปสู่พฤติกรรมที่ขึ้นอยู่กับรูปทรงเรขาคณิตของเทอร์มินัลที่แปลกประหลาดเนื่องจากbashความคิดของที่เคอร์เซอร์ไม่ตรงกับความเป็นจริง


ขอบคุณสิ่งนี้จะช่วยแก้ปัญหา ฉันขอขอบคุณคำอธิบายบางอย่าง: สาเหตุของพฤติกรรมนั้นคืออะไร, วงเล็บเหลี่ยมทำอะไร, ฯลฯ มันคงจะดีถ้ามีทุกอย่างในหน้าเดียวและสามารถช่วยเหลือคนอื่นในอนาคต
Lev Levitsky

@LevLevitsky ฉันได้เพิ่มคำอธิบายสั้น ๆ ให้กับคำตอบ
jw013

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