ใน bash ฉันจะผูกฟังก์ชันคีย์กับคำสั่งได้อย่างไร?


92

ตัวอย่าง: ฉันต้องการผูกF12คีย์เข้ากับคำสั่งecho "foobar"ทุกครั้งที่กดF12ข้อความ "foobar" จะถูกพิมพ์ขึ้นหน้าจอ ตามหลักการแล้วอาจเป็นคำสั่งเชลล์ใด ๆ ก็ได้ไม่ใช่แค่บิวด์อิน จะไปเกี่ยวกับเรื่องนี้ได้อย่างไร?

คำตอบ:


167

คุณสามารถกำหนดลำดับตัวอักษรที่ปล่อยออกมาโดยคีย์โดยการกดCtrl- v. ที่บรรทัดคำสั่งแล้วกดปุ่มที่คุณกำลังสนใจในในระบบของฉันสำหรับฉันได้รับF12 แสดงให้เห็นถึง เทอร์มินัลหรือเทอร์มินัลอีมูเลเตอร์ประเภทต่างๆสามารถปล่อยรหัสที่แตกต่างกันสำหรับคีย์เดียวกัน^[[24~^[Esc

ที่พรอมต์ Bash คุณสามารถป้อนคำสั่งเช่นนี้เพื่อเปิดใช้งานคีย์มาโครเพื่อให้คุณสามารถทดลองใช้ได้

bind '"\e[24~":"foobar"'

ตอนนี้เมื่อคุณกดF12คุณจะได้รับ "foobar" ในบรรทัดคำสั่งพร้อมสำหรับการแก้ไขเพิ่มเติม หากคุณต้องการให้กดแป้นพิมพ์เพื่อป้อนคำสั่งทันทีคุณสามารถเพิ่มขึ้นบรรทัดใหม่:

bind '"\e[24~":"pwd\n"'

ตอนนี้เมื่อคุณกดคุณจะได้รับไดเรกทอรีปัจจุบันแสดงได้โดยไม่ต้องกดF12 Enterจะเกิดอะไรขึ้นถ้าคุณได้พิมพ์บางสิ่งในบรรทัดและคุณใช้สิ่งนี้ซึ่งดำเนินการโดยอัตโนมัติ? มันอาจจะยุ่งเหยิง อย่างไรก็ตามคุณสามารถล้างเส้นเป็นส่วนหนึ่งของมาโครได้:

bind '"\e[24~":"\C-k \C-upwd\n"'

ช่องว่างจะทำให้แน่ใจว่าCtrl- uมีสิ่งที่ต้องลบเพื่อป้องกันไม่ให้กระดิ่งดัง

เมื่อคุณได้รับมาโครทำงานตามที่คุณต้องการแล้วคุณสามารถทำให้มาโครคงอยู่ได้โดยเพิ่มลงใน~/.inputrcไฟล์ของคุณ ไม่จำเป็นต้องใช้bindคำสั่งหรือชุดเครื่องหมายคำพูดเดี่ยวด้านนอก:

"\e[24~":"\C-k \C-upwd\n"

แก้ไข:

คุณยังสามารถสร้างการผูกคีย์ที่จะดำเนินการบางอย่างโดยไม่รบกวนบรรทัดคำสั่งปัจจุบัน

bind -x '"\eW":"who"'

จากนั้นในขณะที่คุณพิมพ์คำสั่งที่ต้องใช้ชื่อผู้ใช้เช่นและคุณต้องการทราบชื่อผู้ใช้ที่ล็อกอินคุณสามารถกดAlt- Shift- Wและผลลัพธ์ของwhoจะปรากฏขึ้นและพรอมต์จะออกใหม่ ด้วยคำสั่งบางส่วนของคุณเหมือนเดิมและเคอร์เซอร์อยู่ในตำแหน่งเดียวกันในบรรทัด

ขออภัยสิ่งนี้ทำงานไม่ถูกต้องสำหรับคีย์ต่างๆเช่นF12ซึ่งมีอักขระมากกว่าสองตัว ในบางกรณีสามารถแก้ไขได้

คำสั่ง ( whoในกรณีนี้) สามารถเรียกใช้งานได้ - โปรแกรมสคริปต์หรือฟังก์ชัน


2
จะเกิดอะไรขึ้นถ้าฉันต้องการเพิ่มการเชื่อมโยงกับ "ctrl + q"
kubudi

5
@kubudi: bind '"\C-q": menu-complete'ตัวอย่างเช่น (หรือในของคุณ~/.inputrc: "\C-q": menu-complete) นอกจากนี้คุณยังอาจต้องstty -ixonของคุณใน~/.bashrcการควบคุมการไหลและการปิดการใช้งานให้ ^ ^ S และ Q ใช้ได้
Dennis Williamson

คุณบอกว่านั่น^[แสดงถึงescและดูเหมือนว่าคุณจะใช้แทน\eในตัวอย่างของคุณ คุณช่วยอธิบายได้ไหมว่าทำไม?
มูฟเวอร์

1
@Remover: ^[เป็นการแสดงผลลัพธ์ \eเป็นวิธีหนึ่งที่จะใส่มัน ( ^[ไม่ทำงานสำหรับที่)
Dennis Williamson

ฉันจะผูก "\ Cz" ได้อย่างไร ฉันชอบที่จะได้รับสิ่งที่เหมือนที่อธิบายไว้สำหรับ zsh ในsheerun.net/2014/03/21/how-to-boost-your-vim-productivity
pkoch

19

คุณสามารถกำหนดการผูกคีย์ bash ใน ~/.inputrc(ไฟล์คอนฟิกูเรชันสำหรับไลบรารี GNU Readline) ไวยากรณ์คือ

<keysym หรือชื่อคีย์>: มาโคร

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

Control-o: "> output"

จะสร้างมาโครที่แทรก "> เอาต์พุต" เมื่อคุณกด ControlO

 "\e[11~": "echo foobar"

จะสร้างมาโครที่แทรก "echo foobar" เมื่อคุณกดF1... ฉันไม่รู้ว่าคีย์เวิร์ดF11เป็นอย่างไร

แก้ไข:

.inputrcเข้าใจ\nลำดับการหลีกเลี่ยงสำหรับ linefeed เพื่อให้คุณสามารถใช้

 "\e[11~": "echo foobar\n"

ซึ่งจะมีประสิทธิภาพ 'กด Enter' หลังจากออกคำสั่ง


4
คุณสามารถใช้ "\ n" ภายในมาโครเพื่อเพิ่มอักขระขึ้นบรรทัดใหม่:
Barton Chittenden

สิ่งนี้ใช้ได้ดีกว่าสำหรับฉันเนื่องจากกำหนดการแมปคีย์ในการเปิดเทอร์มินัล
Heldraug

สำหรับAltการใช้งานเช่น\e "\eo": "> output"
Jānis Elmeris

สำหรับบทแนะนำเชิงลึกเพิ่มเติมเกี่ยวกับการใช้.inputrcโปรดดูที่hackaday.com/2018/01/19/linux-fu-custom-bash-command-completion
Josh Habdas

1
@ArthurHenriqueDellaFraga ฉันแก้ไขคำตอบแล้ว มันจะอยู่ในโฮมไดเร็กทอรีของคุณ หากไม่มีอยู่คุณสามารถสร้างได้
Barton Chittenden

7

โซลูชันนี้เฉพาะสำหรับสภาพแวดล้อม X11 และไม่เกี่ยวข้องกับ bash แต่เพิ่มสิ่งต่อไปนี้ใน. Xmodmaps ของคุณ

 % loadkeys
 keycode 88 = F12
 string F12 = "foobar"
 %

จะส่งสตริง "foobar" ไปที่เทอร์มินัลเมื่อกดปุ่ม F12


โปรดทราบว่าสิ่งนี้ไม่เหมือนกับเชลล์ที่เรียกใช้คำสั่ง หากคุณต้องการเรียกใช้คำสั่งจริงๆคุณจะต้องกด Enter (หรือให้สตริงที่ส่งมาให้คุณ) อาจยังต้องการที่จะปลอดภัยและเคลียร์สายก่อน
Cascabel

2
สิ่งนี้จะยอดเยี่ยม แต่ดูเหมือนว่าจะใช้งานไม่ได้เหมือน Fedora 20 อยู่ดี ฉันลองใช้ xev เพื่อค้นหารหัสคีย์ที่เหมาะสมสำหรับ F12 ก่อน (ในกรณีของฉันคือ 96) และใช้แทน 88 ไม่มีใครทำงาน
BobDoolittle

2

ฉันต้องการผูกCtrl+Bกับคำสั่ง ได้รับแรงบันดาลใจจากคำตอบด้านบนฉันพยายามใช้bindแต่คิดไม่ออกว่าชุดของ squiggles ที่เป็นความลับ ( \e[24~?) แปลเป็นCtrl+Bอะไร

บน Mac ให้ไปที่การตั้งค่าของแอพ Terminal, Profiles -> Keyboard -> +จากนั้นกดแป้นพิมพ์ลัดที่คุณต้องการแล้วมันจะออกมา สำหรับฉันCtrl+Bทำให้\002ฉันประสบความสำเร็จในการออกคำสั่ง

bind '"\002":"echo command"'

นอกจากนี้หากคุณต้องการให้คำสั่งดำเนินการทันที (ไม่ใช่แค่แทรกในพรอมต์) คุณสามารถเพิ่ม Enter ที่ท้ายคำสั่งของคุณได้ดังนี้:

bind '"\002":"echo command\015"'

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