Ctrl-Backspace และ Ctrl-Delete ใน bash


14

วางบน Debian 8.3

stty werase '^H'

หรือบน Arch Linux 2/2016

stty werase '^?'

ใน.bashrc(ตัวอย่าง) ทำให้Ctrl- Backspaceลบคำสุดท้ายในสถานี ก็ยังไม่ได้เป็นลักษณะการทำงานเช่นเดียวกับในโปรแกรม GUI ที่ทันสมัย (เช่น Firefox): มันลบสุดท้ายช่องว่างคำ -separated และไม่คำสุดท้ายคั่นด้วยช่องว่างหรือ. : , ; " ' & / ( )ตัวอักษรเช่น

มันเป็นไปได้ที่จะทำให้Ctrl- Backspaceประพฤติตนอยู่ในขั้วคล้ายกับโปรแกรม GUI สมัยใหม่? นอกจากนี้ยังมีวิธีใดที่จะทำให้Ctrl- Deleteลบคำก่อนเคอร์เซอร์ทันทีหรือไม่


1
เปลือกของคุณอาจสนับสนุนการกระทำเหล่านั้นซึ่งอาจถูกผูกไว้กับคีย์ที่กำหนด
Thomas Dickey

@ThomasDickey: ฉันกำลังใช้ทุบตี ไม่เป็นไรถ้ามันใช้ได้แค่ทุบตี
wolf-revo-cats

คำตอบ:


27

มีตัวแก้ไขสองบรรทัดที่เล่นที่นี่: ตัวแก้ไขบรรทัดพื้นฐานที่จัดเตรียมโดยเคอร์เนล (ตัวแก้ไขบรรทัดโหมด canonical) และตัวแก้ไขบรรทัดของ bash (นำมาใช้ผ่านไลบรารี readline) ทั้งสองนี้มีคำสั่งลบคำก่อนหน้าซึ่งถูกผูกไว้กับCtrl+ Wโดยค่าเริ่มต้น คีย์สามารถกำหนดค่าสำหรับตัวแก้ไขบรรทัด tty line ของโหมด canonical ผ่านstty werase; bash เลียนแบบการเชื่อมโยงคีย์ที่พบในการตั้งค่า tty เว้นแต่จะถูกแทนที่ในการกำหนดค่าของตัวเอง

การweraseดำเนินการใน tty line editor ไม่สามารถกำหนดค่าได้ มันจะลบ (ASCII) คำที่คั่นด้วยช่องว่างเสมอ เป็นเรื่องยากที่จะโต้ตอบกับ tty line editor - เป็นสิ่งที่คุณได้รับเช่นเมื่อคุณพิมพ์catโดยไม่มีอาร์กิวเมนต์ หากคุณต้องการการผูกคีย์แฟนซีคุณสามารถเรียกใช้คำสั่งภายใต้เครื่องมือเช่นrlwrapซึ่งใช้ readline

ทุบตีมีสองคำสั่งที่จะลบคำก่อนหน้า : unix-word-rubout( Ctrl+ wหรือเป็นชุดผ่านstty werase) และbackward-kill-word( M-DELคือEsc Backspace) ซึ่งถือว่าคำเป็นลำดับของตัวอักษรและตัวเลขในสถานที่ปัจจุบันและ _หากคุณต้องการCtrl+ Backspaceเพื่อลบลำดับของอักขระตัวอักษรและตัวเลขก่อนหน้าอย่าตั้งค่าstty weraseและใส่บรรทัดต่อไปนี้แทน.inputrc:

"\C-h": backward-kill-word

หมายเหตุว่านี้อนุมานว่าขั้วของคุณจะส่งตัวละคร Ctrl + H สำหรับ+Ctrl Backspaceน่าเสียดายที่มันเป็นหนึ่งในกุญแจเหล่านั้นที่ไม่มีการเชื่อมโยงมาตรฐาน (และBackspaceโดยเฉพาะอย่างยิ่งเป็นระเบียบสำหรับเหตุผลทางประวัติศาสตร์)

นอกจากนี้ยังมีคำสั่งแบบสมมาตรkill-wordซึ่งถูกผูกไว้กับM-d( Alt+ D) โดยค่าเริ่มต้น การผูกมันCtrl+ Deleteคุณต้องคิดให้ออกว่าลำดับหนี terminal .inputrcของคุณส่งแล้วเพิ่มบรรทัดที่สอดคล้องกันในของคุณ พิมพ์Ctrl+ Vจากนั้นCtrl+ Delete; สิ่งนี้จะแทรกบางสิ่งบางอย่างเช่น^[[3;5~ที่เริ่มต้น^[คือการแสดงภาพของตัวละครที่หลบหนี แล้วการผูกมัดก็คือ

"\e[3;5~": kill-word

หากคุณไม่พอใจกับคำจำกัดความของคำใดคำหนึ่งคุณสามารถระบุของคุณเองใน bash: ดูพฤติกรรมที่ทำให้เกิดความสับสนของปุ่มลัดแบบ emacs ใน bash


2
คำอธิบายที่ยอดเยี่ยม! Ctrl+Delทำงานได้ดี อย่างไรก็ตามฉันไม่สามารถCtrl+Backspaceทำงานได้ สำหรับขั้วของฉันบอกว่าCtrl+v, Ctrl+Backspace ^?ฉันควรใส่.inputrcอะไรดี? ขอบคุณ
Ciprian Tomoiagă

3
@CiprianTomoiaga "\C-?": backward-kill-wordหรือฟังก์ชัน readline ที่คุณต้องการ แต่คุณสามารถกำหนดการผูกพันสำหรับ Ctrl + Backspace ที่แตกต่างจากการรวมสำหรับ Backspace ได้หากพวกเขาส่งอักขระที่แตกต่างกัน หากเทอร์มินัลของคุณส่ง^?ทั้ง Backspace และ Ctrl + Backspace ดังนั้นแอปพลิเคชันที่ทำงานในเทอร์มินัลจะไม่มีวิธีแยกแยะ เทอร์มินัลบางตัวสามารถกำหนดค่าได้ (เช่น xterm, urxvt), อื่น ๆ (เช่นเทอร์มินัลอีมูเลเตอร์ที่ใช้ VTE) ไม่สามารถทำได้
Gilles 'หยุดความชั่วร้าย'

4
มันเป็นสิ่งสำคัญที่จะทราบว่ากำหนดปิดการใช้งานเริ่มต้น~/.inputrc /etc/inputrcในการแก้ไขปัญหานี้คุณต้องรวมไฟล์นั้น: $include /etc/inputrc(จากที่นี่ )
Ciprian Tomoiagă

+1 สำหรับ Esc + Backspace
Celal Ergün

6

ลอง

alt+backspace

ในระบบปฏิบัติการระดับประถมศึกษามันทำงานเหมือนที่คุณต้องการ (เช่นctrl+ backspace)


1

ลักษณะการทำงานของอักขระ WERASE ในการประมวลผลเทอร์มินัลโหมดการปรุงสุกเป็นฮาร์ดโค้ดอย่างน้อยใน Linux:

           if (kill_type == WERASE) {
                   /* Equivalent to BSD's ALTWERASE. */
                   if (isalnum(c) || c == '_')
                           seen_alnums++;
                   else if (seen_alnums)
                           break;
           }

ดังนั้นคำคือตัวอักษรตัวเลขและขีดล่าง นี่คือวิธีที่จะเป็นตลอดเวลาในเทอร์มินัลบนลีนุกซ์เมื่อแอปพลิเคชั่นที่ทำการประมวลผลโหมดการปรุงสุกของตัวเองไม่ทำงาน

เวอร์ชันของ readline (ใช้โดย bash และอื่น ๆ ) ดูเหมือนจะแตกต่างจากเวอร์ชั่นของเคอร์เนลเล็กน้อย แต่ก็ดูเหมือนว่าจะเป็นฮาร์ดโค้ดด้วย :

คำประกอบด้วยตัวอักษรและตัวเลข

แต่ตอนนี้ดูเหมือนจะไม่ตรงกับสิ่งที่bashไม่จริงสำหรับฉัน: จะลบทุกอย่างไม่ได้เป็นเพียงfoo+bar^W barมีข้อมูลเพิ่มเติมเกี่ยวกับที่นี่


1. vi ผู้ใช้อาจจะเพียงแค่มองหาbackward-kill-word(ค่าเริ่มต้นที่มีผลผูกพันM-DEL) unix-word-ruboutแทน
Gilles 'หยุดชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.