การผสมคีย์เฉพาะแอปพลิเคชันใหม่?


18

ฉันรู้วิธีการแมปชุดค่าผสมคีย์ใน Ubuntu ในหลายวิธี (เช่นการตั้งค่าใหม่ทั่วโลก Ctrl + S เพื่อส่ง Ctrl + D หรือบางอย่าง) เช่นแอปพลิเคชันxbindkeys สิ่งที่ฉันต้องการ แต่เป็นวิธีการที่จะทำเช่นนี้เพียงสำหรับการใช้งานที่เฉพาะเจาะจง ตัวอย่างเช่นบางอย่างเช่น "Remap Ctrl + S เพื่อส่ง Ctrl + D แต่เฉพาะใน Chrome " มีวิธีใดบ้างที่จะทำให้สิ่งนี้สำเร็จ?


คุณอ่านกระทู้นี้หรือไม่ ฉันไม่ได้ลอง แต่ดูเหมือนว่าฉันจะเป็นสิ่งที่คุณกำลังมองหา exanctly แต่ฉันไม่รู้ว่าจะเขียนคำตอบที่เหมาะสมอย่างไร
lumbric

คำตอบ:


12

ความคิดของคุณเกี่ยวกับการใช้ xbindkeys ฟังดูดี:

ในการ.xbindkeysrcเพิ่มการผูกกุญแจใหม่ของคุณ:

"app_specific_keys.sh"
   Control+s

นี้จะดำเนินการเมื่อคุณกด"app_specific_keys.sh"ctrl+s

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

xprop -id `xdotool getactivewindow` |awk '/WM_CLASS/{print $4}'

สิ่งนี้จะทำเคล็ดลับ: มันจะถาม xdotool สำหรับหน้าต่างที่ใช้งานอยู่จากนั้นจะถาม xprop สำหรับคุณสมบัติทั้งหมดของหน้าต่างที่มี id ที่กำหนดและจากนั้นจะลดเอาต์พุต verbose ให้เป็นชื่อของแอปพลิเคชัน หากคุณเรียกใช้งานใน gnome-terminal คุณจะได้รับ

"Gnome-terminal"

ตอนนี้คุณต้องกำหนดการกระทำสำหรับแอปพลิเคชันของคุณ:

if [ $N = '"Gnome-terminal"' ]; then                                                    
    xdotool key --clearmodifiers ctrl+s                                                          
else                                                                            
    xdotool key --clearmodifiers ctrl+d                                                          
fi  

ดังนั้นสคริปต์"app_specific_keys.sh"จะมีลักษณะดังนี้:

#!/bin/bash                                                                     
W=`xdotool getactivewindow`                                                     
S1=`xprop -id ${W} |awk '/WM_CLASS/{print $4}'`                                 
S2='"Gnome-terminal"'                                                           
if [ $S1 = $S2 ]; then                                                          
   xdotool key --clearmodifiers ctrl+d                                             
else                                                                            
   xdotool key --clearmodifiers ctrl+s                                          
fi  

สิ่งนี้ควรใช้งานได้ แต่ในคำถามนี้ฉันต้องยอมรับว่าไม่ได้ อาจเป็นเพราะหนึ่งใน Compiz, Unity, Global Menu ใช้งานไม่ได้กับ--clearmodifiersตัวเลือกของ xdotool วิธีแก้ปัญหาที่จะเพิ่มการนอนหลับอยู่ในด้านหน้าของสคริปต์ของคุณใน oder เพื่อให้สามารถที่จะปล่อยปุ่มด้วยตัวเอง: ในของคุณ.xbindkeysrcเปลี่ยนเป็นปุ่มลัดนี้:

"sleep 0.5; app_specific_keys.sh"
   Control+s

ในฐานะ sidenote: สิ่งนี้จะไม่ทำงานหากคุณต้องการเปลี่ยนคีย์สำหรับโปรแกรมที่รันในเทอร์มินัล (เช่น vi หรือ emacs ในโหมดคอนโซล) คลาสแอปพลิเคชันที่ส่งคืนจะยังคงเป็น "Gnome-terminal"

หวังว่าจะช่วย


1
จบลงด้วยการทำงานได้ดี ผมไม่ได้ใช้ xdotool xvkbd -xsendevent -text "\Cs"ส่งการกดแป้นพิมพ์ที่ฉันเพิ่งใช้ สิ่งนี้ดูเหมือนจะไม่ประสบปัญหาที่คุณเห็นด้วย xdotool
ดีเร็ก Thurn

มันเป็นไปไม่ได้ที่จะทำให้การเรียกร้องที่สำคัญตัวเองเช่นการเรียกf xdotool key fยังคงค้นหาวิธีการทำเช่นนี้
phil294

ฮ่า, ในที่สุดก็เจอ! xdotool type --window $(xdotool getwindowfocus) [keys] การใช้ตัวเลือก - หน้าต่างและส่งไปที่หน้าต่างที่ใช้งานอยู่ในปัจจุบันจะไม่นำไปสู่พฤติกรรมแบบเรียกซ้ำ
phil294

2

autokeyเป็นเหมือน AutoHotkey สำหรับ Ubuntu คุณสามารถเขียนสคริปต์ในไพ ธ อนและเรียกใช้งานผ่านทางแป้นพิมพ์ลัดและตัวกรอง windows (ทำให้เป็นโปรแกรมเฉพาะหลอก) สคริปต์ของคุณสามารถควบคุมเหตุการณ์แป้นพิมพ์และเมาส์และแม้แต่เลื่อนหน้าต่างไปรอบ ๆ เพื่อเพิ่มสัมผัส


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