ฉันสามารถกำหนดค่า bash / readline เพื่อแปลง NBSP เป็นพื้นที่ปกติได้หรือไม่


10

ฉันใช้รูปแบบแป้นพิมพ์ภาษาฟินแลนด์ซึ่งแผนที่AltGr+ Spaceไปยังพื้นที่ที่ไม่ทำลาย (NBSP, U + 00A0) ฉันมีความสุขกับสิ่งนี้โดยทั่วไป แต่ฉันพบว่าฉันมักจะเขียน NBSP โดยไม่ได้ตั้งใจแทนพื้นที่ว่างหลัง|สัญลักษณ์ "" (เขียนด้วยAltGr+ <ด้วยรูปแบบแป้นพิมพ์ภาษาฟินแลนด์) ขณะใช้บรรทัดคำสั่ง bash ฉันเดาว่ามันเกิดจากความจริงที่ว่าฉันต้องกดค้างไว้AltGrในขณะที่พิมพ์ไปป์และปล่อยมันก่อนที่จะกดปุ่มพื้นที่ และเมื่อฉันมีเวลาไม่ดีสำหรับการเปิดตัวของAltGrฉันฉันก็จบลงด้วยการพิมพ์ผิดที่มองไม่เห็นในบรรทัดคำสั่งและข้อความผิดพลาดเช่น

 grep: command not found

ซึ่งมีลักษณะคล้ายกับ

grep: command not found

ซึ่งทำให้ปัญหานี้เล็กน้อยยากที่จะสังเกตเห็นในครั้งแรก

ฉันรู้ว่าฉันสามารถปิดการใช้งาน NBSP ได้แต่ฉันต้องการปิดการใช้งาน (โดยมีAltGr+ Spaceเพื่อสร้างพื้นที่ปกติ) เฉพาะหลังจากที่ไปป์ไลน์หรือหากไม่สามารถทำได้ให้ใช้คำสั่ง bash หรือreadlineระดับบรรทัดเสมอ มีวิธีง่ายๆในการทำเช่นนี้โดยไม่ต้องแก้ไขซอร์สโค้ดของ bash readlineหรือเทอร์มินัลอีมูเลเตอร์ของฉัน ( gnome-terminal)?

อีกวิธีที่ดีคือการกำหนดค่า NBSP ให้ปรากฏบนบรรทัดคำสั่งอย่างใดอย่างหนึ่งเช่นแทนที่ด้วยอักขระอื่น (พูด U + 2423 ) สำหรับการเรนเดอร์เท่านั้น


@dessert ไม่จำเป็นต้องมีเงินรางวัลจริงๆ ฉันเพิ่งพบปัญหาและเขียนคำถามเกี่ยวกับมัน ต่อมาฉันพบว่าการกำหนดค่าใกล้พอผ่าน Google Search เพื่อค้นหาคำตอบด้านล่าง ฉันยังคงมองหาคำตอบเพื่อให้มองเห็น NBSP แทนที่จะปิดใช้งานตัวละครในทุกกรณี ฉันคิดว่าฉันต้องการให้มี NBSP ที่มองเห็นได้ในระดับ readline เพื่อที่ว่าเทอร์มินัลเอาท์พุตทั้งหมดจะไม่เกิดความสับสนถ้าฉันมี NBSP ในสายข้อมูล
Mikko Rantalainen

@MikkoRantalainen คุณช่วยอธิบายสิ่งที่คุณยังขาดหายไปได้ชัดเจนขึ้นหรือไม่? เมื่อคุณค้นพบวิธีการแมปตัวอักษรทำไมถึงไม่" ":␣พอ? คุณต้องการอะไรอีก
terdon

@ ขนมหวานฉันชอบที่จะมีคุณสมบัติที่ฉันสามารถเขียน NBSP บนบรรทัดคำสั่งและรับecho a␣bแต่บรรทัดผลลัพธ์ที่ได้คือecho a bNBSP จริงในผลลัพธ์ ดังนั้นฉันคิดว่ามันต้องทำในระดับ readline (นั่นคือตัวแก้ไขบรรทัดคำสั่งจะแสดงตัวอักษรที่มองเห็นได้เสมอ แต่เทอร์มินัลอีมูเลเตอร์ไม่สามารถรู้ถึงความแตกต่างระหว่างการแสดงผลเอดิเตอร์และการแสดงผล )
Mikko Rantalainen

1
การแก้ปัญหาในระดับ readline นั้นดีมาก แต่คุณอาจประสบปัญหาเดียวกันในขณะที่เขียนเชลล์สคริปต์ใน vim / emacs / etc ในเทอร์มินัล ดูbugzilla.gnome.org/show_bug.cgi?id=788673เพื่อพิสูจน์การทำงานของชุดข้อมูลแนวคิดสำหรับ gnome-terminal เพื่อเน้นการจับคู่สตริงรวมถึงอักขระ NBSP เดี่ยว (ใช่ฉันรู้ว่าคุณบอกว่าคุณไม่ต้องการแก้ไขซอร์สโค้ดใด ๆ …)
egmont

1
อีกวิธีคือจัดการกับระดับตัวอักษรผ่านฟอนต์พิเศษที่ glyph ของ NBSP ไม่ว่างพร้อมกับการกำหนดค่าแบบอักษรบางอย่าง สิ่งนี้จะใช้ได้กับโปรแกรมแก้ไขกราฟิกไม่ใช่เฉพาะเทอร์มินัล อีกวิธีหนึ่งคือการปรับเปลี่ยนเค้าโครงแป้นพิมพ์เพื่อปล่อยพื้นที่ปกติและใช้วิธีอื่นเพื่อป้อน NBSP ในกรณีที่หายากเมื่อนั่นคือสิ่งที่คุณต้องการ
egmont

คำตอบ:


9

สามารถทำได้ในreadlineระดับที่แตกต่างกันสองวิธี

วิธีที่ 1

ใส่ต่อไปนี้ใน.inputrc(ไฟล์กำหนดค่าสำหรับreadline):

# include default system config because ~/.inputrc overrides system config
$include /etc/inputrc
# map NBSP to regular space (left part has NBSP in quotes, right part has space)
" ":" "

หาก markdown ทำให้ยุ่งเหยิงข้างต้นคุณต้องใส่ NBSP ในเครื่องหมายคำพูดทางด้านซ้ายของเครื่องหมายโคลอนตามที่อธิบายไว้ในความคิดเห็น สิ่งนี้จะแมปการเกิด NBSP ใด ๆ บนอินพุตสตรีมด้วยพื้นที่ปกติ

วิธีที่ 2

ใส่ต่อไปนี้ใน.inputrc:

# include default system config because ~/.inputrc overrides system config
$include /etc/inputrc
# map "pipe + NBSP" to "pipe + regular space" (left part has NBSP in quotes)
"| ":"| "
set keyseq-timeout 250

แนวคิดคือการแม็พลำดับคีย์ {pipe ตามด้วย NBSP} กับ {pipe ตามด้วย space} ใช้งานได้ถ้าคุณพิมพ์ลำดับภายใน 250 ms (กำหนดค่าได้ด้านบน) อย่างไรก็ตามจนกระทั่งหมดเวลาการพิมพ์สัญลักษณ์ไปป์เพียงอย่างเดียวจะไม่แสดงผลใด ๆ และถ้าคุณพิมพ์ลำดับช้าเกินไปการแก้ไขจะไม่ถูกนำไปใช้ โปรดทราบว่าการหมดเวลาเป็นแบบโกลบอลดังนั้นหากคุณต้องการใช้ลำดับอื่นคุณต้องตั้งค่าการหมดเวลาให้นานพอที่จะพิมพ์ลำดับที่ยาวที่สุดได้ (ไลบรารี readline ไม่ฉลาดพอที่จะอนุญาตให้พิมพ์อักขระและหลังจากนั้นแทนที่อักขระที่มองเห็นได้แล้วหลังจากลำดับอักขระตรงกับการกำหนดค่า)


0

มีบทความที่ยอดเยี่ยมเกี่ยวกับปัญหานี้:

ฉันพยายามที่จะแก้ไขข้อกังวลหลักด้วยgrepข้อความแสดงข้อผิดพลาดและเปลี่ยน NBSP เป็นสิ่งที่มองเห็นได้โดยใช้execคำสั่ง ฉันยังไม่ได้ไวยากรณ์ซะทีว่า:

exec 2> >(tr $'\xa0' $'\x43' >&2) 

แนวคิดคือการมีคำสั่งนี้~/.bashrcเพื่อให้โหลดโดยอัตโนมัติเมื่อมีการgnome-terminalเปิด แต่อย่างที่ฉันบอกว่ามันยังไม่ทำงาน ...


1
ที่จะจัดการกับข้อความผิดพลาดเท่านั้น ฉันชอบที่จะจับปัญหาขณะที่ฉันกำลังแก้ไขบรรทัดคำสั่งเพราะผมอาจจะเขียนสิ่งที่ต้องการperl -i -npe 's/MARKER/4 KB/'และฉันตั้งใจลื่น NBSP ระหว่างและ4 Kโอ๊ะปัญหาได้รับการจัดเก็บเป็นไฟล์ แต่ฉันไม่ได้รับข้อผิดพลาดใด ๆ และบรรทัดคำสั่งที่ฉันเขียนนั้นดูสมบูรณ์แบบ
Mikko Rantalainen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.