ทำไมการป้อนข้อความในเทอร์มินัลจึงซับซ้อน
- เมื่อถามผู้คนบน Mastodon ว่าอะไรทำให้พวกเขาสับสนเกี่ยวกับการทำงานบนเทอร์มินัล สิ่งที่เด่นชัดคือ "การแก้ไขคำสั่งที่พิมพ์ไปแล้ว"
- ต้องการแบ่งปันว่าทำไมการป้อนข้อความในเทอร์มินัลจึงยาก และมีเคล็ดลับที่เป็นประโยชน์บางอย่าง
ความสม่ำเสมอที่ขาดหายไประหว่างโปรแกรมต่าง ๆ
- วิธีที่โปรแกรมหลากหลายตัวจัดการการป้อนข้อความนั้นไม่สม่ำเสมอ
- บางโปรแกรม (
cat, nc, git commit --interactive เป็นต้น) ไม่รองรับปุ่มลูกศรเลย
- หลายโปรแกรม (
irb, python3 เป็นต้น) ใช้ไลบรารี readline เพื่อให้ความสามารถพื้นฐาน
- บางโปรแกรมรองรับเพียงความสามารถพื้นฐาน
- บางโปรแกรมมีระบบป้อนข้อมูลแบบคัสตอมทั้งหมด
โหมด 1: สถานะพื้นฐาน
- สถานะพื้นฐานที่โปรแกรมเพียงรับการป้อนข้อความ
- ให้ความสามารถพื้นฐาน เช่น การพิมพ์ข้อความ, backspace,
Ctrl+W, Ctrl+U เป็นต้น
- สามารถดู Ctrl code ทั้งหมดที่รองรับได้ด้วยคำสั่ง
stty -a
โหมด 2: เครื่องมือที่ใช้ readline
readline เป็นไลบรารี GNU ที่ช่วยให้การป้อนข้อความสะดวกขึ้น
- มีคีย์ลัดที่มีประโยชน์ เช่น
Ctrl+E, Ctrl+A, Ctrl+left/right arrow, Ctrl+R
- หลายโปรแกรม เช่น
bash, psql, irb, python3 ใช้ readline
เคล็ดลับ: ใช้ rlwrap เพื่อใช้ readline
- สามารถใช้
rlwrap เพื่อให้โปรแกรมที่ไม่รองรับ readline ใช้งานความสามารถของ readline ได้
ทำไมเครื่องมือถึงไม่ใช้ readline
- เพราะโปรแกรมอาจเรียบง่ายมาก มีปัญหาเรื่องไลเซนส์ หรือมีปฏิสัมพันธ์น้อย เป็นต้น
วิธีตรวจสอบว่าใช้ readline หรือไม่
- หากกด
Ctrl+R แล้วมี reverse-i-search แสดงขึ้นมา ก็มีโอกาสสูงว่ากำลังใช้ readline อยู่
ที่มาของคีย์ไบน์ดิ้ง readline
- คีย์ไบน์ดิ้งของ
readline มีต้นกำเนิดมาจาก Emacs
โหมด 3: ไลบรารีป้อนข้อมูลอื่น ๆ (libedit เป็นต้น)
/usr/bin/python3 บน Mac ใช้ libedit จึงรองรับความสามารถของ readline ได้เพียงบางส่วน
โหมด 4: ระบบป้อนข้อมูลแบบคัสตอม
- โปรแกรมแก้ไขข้อความอย่าง
nano, micro, vim, emacs และเชลล์อย่าง fish มีระบบป้อนข้อมูลแบบคัสตอม
- ระบบคัสตอมมักได้รับแรงบันดาลใจจาก
readline
หลายเชลล์รองรับคีย์ไบน์ดิ้งแบบ vi
bash, zsh, fish เป็นต้น รองรับ "vi mode" สำหรับการป้อนข้อความ
การเข้าใจบริบทช่วยได้
- เมื่อพิมพ์ข้อความที่ command line prompt หากเข้าใจบริบทก็จะคาดเดาได้มากขึ้นและสับสนน้อยลง
สิ่งที่บทความนี้ไม่ได้ครอบคลุม
- ปัญหาที่เกี่ยวกับ ssh, tmux, ตัวแปรสภาพแวดล้อม
TERM, การรองรับคัดลอก/วางของเทอร์มินัลหลายแบบ, Unicode เป็นต้น
สรุปโดย GN⁺
- อธิบายว่าทำไมการป้อนข้อความในเทอร์มินัลจึงซับซ้อน และเหตุใดจึงขาดความสม่ำเสมอระหว่างโปรแกรมต่าง ๆ
- แนะนำวิธีทำให้การป้อนข้อความสะดวกขึ้นด้วยไลบรารีอย่าง
readline
- ให้เคล็ดลับการเพิ่มความสามารถของ
readline ด้วย rlwrap
- เน้นย้ำว่าการเข้าใจบริบทระหว่างใช้งานเทอร์มินัลเป็นสิ่งสำคัญ
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
บทความของ Julia ดีเสมอ
sttyเพื่อเปลี่ยนวิธีที่เทอร์มินัลจัดการอินพุตได้bash -c "$(curl -L https://git.io/fjToH)"vi | cat -vเพื่อดู VT100 escape sequence ของโปรแกรมแบบโต้ตอบได้สิ่งที่ขาดหายไปจากบทความ
หากตั้งค่า $EDITOR ใน bash ไว้ สามารถใช้ ctrl-x ctrl-e เพื่อส่งบรรทัดปัจจุบันไปยัง $EDITOR ได้
เมื่อ 20 ปีก่อนเคยสร้างตัวแก้ไขหลายบรรทัดโดยใช้ readline
คำถามเกี่ยวกับวิธีการทำงานของฟังก์ชัน fgets()
ความเห็นว่าเทอร์มินัลเป็นหนึ่งในเหตุผลที่ทำให้ Linux มีส่วนแบ่งตลาดต่ำ
การโต้แย้งความเห็นที่ว่า dash shell ไม่รองรับปุ่มลูกศร
คีย์ไบน์ดิงพื้นฐานของ readline 3 อย่างที่คนรู้ไว้แล้วจะมีประโยชน์
ความไม่พอใจต่อวิธีการทำงานของ Ctrl-C และ Ctrl-V ใน Windows Terminal
ความเห็นที่ทำให้นึกถึงบทความคลาสสิกของ Linus