ตัวอย่าง: ฉันต้องการผูกF12คีย์เข้ากับคำสั่งecho "foobar"
ทุกครั้งที่กดF12ข้อความ "foobar" จะถูกพิมพ์ขึ้นหน้าจอ ตามหลักการแล้วอาจเป็นคำสั่งเชลล์ใด ๆ ก็ได้ไม่ใช่แค่บิวด์อิน จะไปเกี่ยวกับเรื่องนี้ได้อย่างไร?
ตัวอย่าง: ฉันต้องการผูกF12คีย์เข้ากับคำสั่งecho "foobar"
ทุกครั้งที่กดF12ข้อความ "foobar" จะถูกพิมพ์ขึ้นหน้าจอ ตามหลักการแล้วอาจเป็นคำสั่งเชลล์ใด ๆ ก็ได้ไม่ใช่แค่บิวด์อิน จะไปเกี่ยวกับเรื่องนี้ได้อย่างไร?
คำตอบ:
คุณสามารถกำหนดลำดับตัวอักษรที่ปล่อยออกมาโดยคีย์โดยการกด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
ในกรณีนี้) สามารถเรียกใช้งานได้ - โปรแกรมสคริปต์หรือฟังก์ชัน
bind '"\C-q": menu-complete'
ตัวอย่างเช่น (หรือในของคุณ~/.inputrc
: "\C-q": menu-complete
) นอกจากนี้คุณยังอาจต้องstty -ixon
ของคุณใน~/.bashrc
การควบคุมการไหลและการปิดการใช้งานให้ ^ ^ S และ Q ใช้ได้
^[
แสดงถึงesc
และดูเหมือนว่าคุณจะใช้แทน\e
ในตัวอย่างของคุณ คุณช่วยอธิบายได้ไหมว่าทำไม?
^[
เป็นการแสดงผลลัพธ์ \e
เป็นวิธีหนึ่งที่จะใส่มัน ( ^[
ไม่ทำงานสำหรับที่)
คุณสามารถกำหนดการผูกคีย์ 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' หลังจากออกคำสั่ง
Alt
การใช้งานเช่น\e
"\eo": "> output"
.inputrc
โปรดดูที่hackaday.com/2018/01/19/linux-fu-custom-bash-command-completion
โซลูชันนี้เฉพาะสำหรับสภาพแวดล้อม X11 และไม่เกี่ยวข้องกับ bash แต่เพิ่มสิ่งต่อไปนี้ใน. Xmodmaps ของคุณ
% loadkeys
keycode 88 = F12
string F12 = "foobar"
%
จะส่งสตริง "foobar" ไปที่เทอร์มินัลเมื่อกดปุ่ม F12
ฉันต้องการผูก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"'