การโยง backward-kill-word ถึง Ctrl + w


23

ฉันกำลังพยายามเปลี่ยนจากการใช้ Tcsh เป็นเวลานานเป็นการสำรวจล่าสุดของ Bash

ฉันจัดการพอร์ตคุณสมบัติที่ชื่นชอบทั้งหมดยกเว้น Ctrl + w ที่ใช้ช่องว่างและเครื่องหมายทับเป็นขอบเขตของคำซึ่งเป็นไปได้มากว่า back-kill-word ใน Bash อย่างไรก็ตาม readline จะลบไปจนถึงช่องว่างแรกโดยลบเครื่องหมายทับทั้งหมดระหว่าง

ฉันได้ลองใช้ชุด \ Cw: หลายแบบย้อนหลัง - ฆ่า - คำทั้ง .putrc และ. bashrc โดยใช้การโยง แต่ฉันไม่สามารถทำให้มันทำงานได้อย่างที่ต้องการ

ตลกพอผ่าน Putty จาก Windows ในที่ทำงานฉันสามารถใช้ Alt + Backspace ซึ่งคู่มือบอกว่าเป็นการเชื่อมโยงเริ่มต้นเพื่อสร้างพฤติกรรมที่แน่นอนที่ฉันต้องการ แต่ใน Terminal.app บน Mac ของฉันที่บ้านมันไม่ทำงาน ไปเหมือนกันสำหรับเซิร์ฟเวอร์ FreeBSD หรือ Linux ใด ๆ ที่ฉันเคยเข้าสู่ระบบจาก Terminal.app

ดังนั้นฉันจึงหันไปหา superuser เพื่อขอความช่วยเหลือ

คำตอบ:


40

readlineไม่ผูกมัดCtrl- Wเนื่องจากมีการจัดการโดยไดรเวอร์เทอร์มินัลโดยค่าเริ่มต้น:

$ stty -a
(...) werase = ^W; (...)

หากต้องการปิดใช้งานสิ่งนี้คุณต้องเรียกใช้ (ใน~/.bashrc):

stty werase undef
bind '"\C-w": backward-kill-word'

.inputrcจะไม่ช่วยนี่เพราะมันเป็นที่อ่านเมื่อCtrl- ยังคงได้รับมอบหมายให้Wwerase

นอกจากนี้โปรดทราบว่า\C-wรูปแบบ keyseqs ต้องอยู่ในเครื่องหมายคำพูดคู่ดังกล่าวข้างต้น


อาคารที่แตกต่างกันอาจจัดการAlt- Backspaceแตกต่างกัน

  • PuTTY และเทอร์มินัล GNOME (พร้อมการตั้งค่าเริ่มต้น) ส่ง1b 7f( ESC DEL)
  • Xterm พร้อมmetaSendsEscape: trueส่ง1b 08( ESC BS)
  • Xterm ที่ไม่มีการ metaSendsEscapeส่ง88( HTSหรือBSชุดบิตสูงสุด)

Xterm มีการตั้งค่าบางอย่างเพื่อควบคุมการทำงานของAltคีย์ ( Metaโดยทั่วไปเรียกว่าXterm และ X11) ด้วยการmetaSendsEscapeกดค้างAltจะนำหน้าการกดคีย์ด้วยESC(ฐานสิบหก1b) หากไม่มีการตั้งค่า (โหมดเริ่มต้น) Altจะตั้งค่าบิตสูงสุดของอักขระอินพุตทำให้มีอักขระพิเศษ (ตัวอย่างเช่นAlt- Nผลลัพธ์ในESC nและîตามลำดับ)

เท่าที่ฉันจำได้เทอร์มินัลแอพยังมีการตั้งค่าที่คล้ายกันเพื่อควบคุมพฤติกรรมของ Meta / Alt / what-Macs-use


นี่ไม่ใช่เพียงคำตอบที่ดีที่สุด แต่ให้ข้อมูลอย่างมากขอบคุณ!
Stefan M

1
@shurane: การดำเนินการwerase "word erase" เช่นการลบปกติ (Backspace) ถูกนำมาใช้โดยระบบปฏิบัติการของตัวเองในไดรเวอร์ "อุปกรณ์ tty" - สังเกตว่าพวกเขามีอยู่ในโปรแกรมที่เพิ่งอ่านจาก stdin เช่นสุ่มสี่สุ่มห้าcat. ใน Unixes ทั้งหมดsttyใช้เพื่อควบคุมพารามิเตอร์ tty ต่างๆรวมถึงปุ่มพิเศษเหล่านี้ (นี่คือลักษณะของUNIX 7th Editionstty )
grawity

1
@shurane: ในขณะเดียวกันreadlineเป็นไลบรารี userspace ที่เขียนขึ้นสำหรับbash shell (แม้ว่าตอนนี้จะถูกใช้โดยหลาย ๆ โปรแกรม) อาจเป็นไปได้ว่ามีการดำเนินการอื่น ๆ ในreadlineเพื่อหลีกเลี่ยงการ bloating ไดรเวอร์ tty (ซึ่งมีแฟล็กและสลับจำนวนมากอยู่แล้วตามที่เห็นในsttyคู่มือการใช้งาน) นอกจากนี้ทุบตีเดิมมีไว้สำหรับระบบปฏิบัติการ GNUและต่อมาพอร์ตเฉพาะกับ Unixes อื่น ๆ ; มันง่ายกว่ามากในการรักษาฟีเจอร์การแก้ไขในไลบรารีเดียวมากกว่าในเมล็ดที่แตกต่างกันหลายอย่าง
grawity

3
@shurane: ในทางเทคนิคแล้วการกระทำทั้งหมดเหล่านี้รวมถึงการลบคำจะถูกนำไปใช้โดยreadline - เมื่อเปิดใช้งานมันจะปิดการใช้งาน Backspace และ Ctrl + W อย่างสมบูรณ์โดยไดรเวอร์เทอร์มินัล readlineเพียงแค่เคารพการsttyกำหนดค่าเพื่อความเรียบง่าย แต่สามารถแทนที่ได้ด้วยการตั้งค่าของreadline (ดังที่อธิบายไว้ในคำตอบของ Matt Day)
grawity

4
นี่คือคำตอบที่ดีสำหรับข้อมูล upvote อย่างไรก็ตามควรสังเกตว่านี่เป็นการปิดการใช้งาน Ctrl-w สำหรับทุกโปรแกรมยกเว้นว่าพวกเขาใช้ readline ซึ่งอาจไม่ใช่สิ่งที่ทุกคนต้องการ ... ดังนั้นลองใช้คำตอบของ @fjarlq
0fnt

19

grawity เขียนว่าสิ่งนี้ไม่สามารถควบคุมได้ใน.inputrcไฟล์ แต่มันไม่ถูกต้อง

หากคุณset bind-tty-special-chars offอยู่ในของ.inputrcคุณคุณสามารถกำหนดลักษณะการทำงานของเทอร์มินัลพิเศษได้

ตัวอย่างเช่น:

set bind-tty-special-chars off
Control-u: kill-whole-line
Control-w: backward-kill-word

2
และสิ่งนี้มีประโยชน์ในการทำงานให้กับโปรแกรมทั้งหมดที่ใช้ pythonReadLine-เช่น,
wchargin

3

สำหรับบันทึกคำตอบที่ใช้กับ iTerm2 คือการตั้งค่าAlt- Backspace(หรือOpt ⌥- บน Mac) เพื่อส่งรหัส Hex 0xb1และ0x7fเพื่อดำเนินbackward-kill-wordการที่ใช้อักขระที่ไม่ใช่ตัวอักษรและตัวเลขเป็นตัวคั่น

เพื่อความแตกต่างนี่คือพฤติกรรมที่ฉันอธิบายซึ่งการกดOpt ⌥- หนึ่งครั้งเปลี่ยนสิ่งนี้:

echo "/example/filepath/with_non-alpha.characters@blah:meh

สำหรับสิ่งนี้:

echo "/example/filepath/with_non-alpha.characters@blah:

และกดที่ตามมาของOpt ⌥- :

echo "/example/filepath/with_non-alpha.characters@

echo "/example/filepath/with_non-alpha.

echo "/example/filepath/with_non-

echo "/example/filepath/with_

echo "/example/filepath/

นี่คือลักษณะการตั้งค่าใน iTerm2: ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นสำหรับ Putty และ Terminal โดยเฉพาะคำตอบของ grawityนั้นยอดเยี่ยม แต่ต้องใช้เวลาในการค้นหาวิธีใช้การตั้งค่าใน iTerm2 ที่น่าอายโพสต์ของผู้ใช้ขั้นสูงนี้ดูเหมือนจะเกิดขึ้นบ่อยที่สุดดังนั้นจึงมีความรับผิดชอบที่จะต้องให้ข้อมูลที่เกี่ยวข้องตามที่ใช้กับ iTerm2 เป็นคำตอบ


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