ฉันจะทำการแมปคีย์หรืออุปกรณ์บางอย่างได้อย่างไร


236

ฉันกำลังค้นหาวิธีการแมปคีย์บางอย่างในอูบุนตู

กล่าวคือ

ฉันต้องการที่จะเปลี่ยนPgUpไปHomeหรือเพื่อPgDownEnd

คำสั่งในตัวหรือเครื่องมือมีการกำหนดคีย์ใหม่ใน Ubuntu / GNOME หรือไม่?


ชำระเงินของฉันตอบที่นี่ ไม่คุ้มกับการคัดลอกและวางคำตอบเดียวกัน บางทีมันอาจช่วยคุณได้
ราหุล Virpara

1
มีการผูกมัด Emacs ใด ๆ ที่นี่สำหรับ CTRL-P / N สำหรับหน่วยขั้นตอนหรือไม่
LéoLéopold Hertz 준영

เมื่อเวลาผ่านไปxmodmapก็จะแยกออก! xkbเพื่อให้ได้ระบบกว้างตั้งค่าที่คุณต้องใช้ ดังนั้นแก้ไขไฟล์ภาษา/usr/share/X11/xkb/symbols/เพื่อเพิ่มการเปลี่ยนแปลงของคุณที่นั่น ดูaskubuntu.com/a/898462/34298
rubo77

คำตอบ:


249

หมายเหตุ:ในฐานะที่เป็นของปี 2013 Ubuntu และสัญญาซื้อขายล่วงหน้าไม่ได้ใช้แต่แทนที่จะใช้xmodmap xkbสำหรับข้อมูลเพิ่มเติมดูคำตอบนี้ คำตอบด้านล่างไม่เกี่ยวข้องกับการเผยแพร่ในปัจจุบันอีกต่อไป


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

  1. เริ่มหน้าต่าง terminal xevและเรียกใช้ ตอนนี้มันทำงานอยู่และรอให้คุณกดปุ่ม จากนั้นกดปุ่มที่มีพฤติกรรมที่คุณต้องการเปลี่ยน PgUpกล่าวคือ

  2. xevจะส่งออกข้อมูลบางอย่างเกี่ยวกับปุ่มกด บรรทัดที่สามมีความสำคัญ ควรมีลักษณะคล้ายกับ:

    state 0x10, keycode 110 (keysym 0xff55, Prior), same_screen YES,
    

    ในตัวอย่างนี้Priorเป็นชื่อของพฤติกรรมที่คีย์ได้รับมอบหมายในขณะนี้รหัส key คือรหัสภายในที่จะรับรู้คีย์ ตอนนี้ทำกับคีย์อื่นเช่นPgDownให้ออกนี้

    state 0x10, keycode 115 (keysym 0xff56, Next), same_screen YES,
    

    ที่นี่อีกครั้งส่วนที่น่าสนใจสำหรับเราคือkeycode 115และNext- ชื่อของพฤติกรรม

  3. xmodmapตอนนี้เมื่อคุณต้องการที่จะสลับสองปุ่มใช้

     xmodmap -e "keycode 110 = Next"
    

    นี้การเปลี่ยนแปลงที่สำคัญที่มี keycode 110 Nextบนแป้นพิมพ์เพื่อการดำเนินการ มันค่อนข้างง่าย

    โปรดทราบว่าหากคีย์ที่คุณกำลังจับคู่ควรมีความหมายที่แตกต่างกันเมื่อใช้กับShiftคีย์ (ตัวอย่างเช่นสำหรับรูปแบบแป้นพิมพ์ภาษาอังกฤษShift+ 2ให้เครื่องหมายคำพูด) คุณสามารถแสดงรายการคำสั่งรองหลังจากคำสั่งแรก ตัวอย่างเช่นหากคุณต้องการคีย์ที่มีรหัส 53 เพื่อแมปไปยังแบ็กสแลชตามปกติ แต่ไปที่สัญลักษณ์บาร์เมื่อใช้กับ shift คุณอาจทำ:

     xmodmap -e "keycode 53 = backslash bar"
    

ข้อมูลเพิ่มเติม:ลำดับของแมปเหล่านี้คือKey, Shift+Key, mode_switch+Key, mode_switch+Shift+Key, ,AltGr+Key ที่จะข้ามไปใช้คอลัมน์AltGr+Shift+Key NoSymbolนอกจากนี้นี่คือรายการที่ครอบคลุมของ keysyms ทั้งหมด

หมายเหตุ: การเปลี่ยนแปลงเหล่านี้มีไว้สำหรับเซสชัน X ที่ใช้งานอยู่เท่านั้นและจะหายไปหลังจากรีบูต เมื่อคุณต้องการบันทึกการเปลี่ยนแปลงอย่างถาวรคุณต้องเรียกใช้คำสั่งต่อไปนี้หลังจากคำสั่งด้านบน:

xmodmap -pke >~/.Xmodmap

(มันสร้างไฟล์ชื่อ.Xmodmapในไดเรกทอรีบ้านของคุณ ( ~))

จากนั้นคุณต้องสร้างไฟล์ที่มีชื่อ.xinitrcในโฮมไดเร็กตอรี่ที่คุณใส่คำสั่งxmodmap .Xmodmapเข้าไป

ตอนนี้คุณสามารถปรับเปลี่ยน.Xmodmapและเรียกใช้xmodmap .Xmodmapจากคอนโซลเพื่อดูการเปลี่ยนแปลงในทันที การเปลี่ยนแปลงใน.Xmodmapจะยังคงมีอยู่

แหล่งที่มา: Ubuntu Foruns

สิ่งโบนัส:

หากคีย์ที่คุณกำลังทำการแมปมีพฤติกรรมแตกต่างกันขึ้นอยู่กับสถานะ (เช่นวิธีที่แป้นในแป้นพิมพ์ตัวเลขขึ้นอยู่กับ NumLock) คุณเพียงแค่ต้องทำxmodmap -pmเพื่อรับรายการตัวดัดแปลงจากนั้นทำดังนี้

xmodmap -e "KEYCODE MODIFIER = behaviour behaviour_with_modifier"

ตัวอย่างเช่นสมมติว่าคุณต้องการรับช่วงเวลาแทนที่จะเป็นเครื่องหมายจุลภาคบนแป้นพิมพ์ตัวเลข (มีประโยชน์สำหรับโปรแกรมเมอร์ส่วนใหญ่) แต่คุณต้องการรักษาการทำงาน "ลบ" เมื่อ NumLock ปิดอยู่

xmodmap -e "keycode 91 mod2 = KP_Delete period"

mod2เพราะxmodmap -pmบอกเราว่าmod2เป็นNum_Lockที่ชื่ออื่น ๆ xevจะได้รับโดยการกดปุ่มใน


3
xevไม่สามารถจับFnการกดคีย์ได้
Om-Nom-Nom

3
คำตอบที่เลือกไม่ทำงานสำหรับการแมปคีย์ Caps-lock สำหรับฉันใหม่บน Ubuntu 12.10 ฉันสามารถทำได้โดยไปที่การตั้งค่าระบบ -> คีย์บอร์ด -> การตั้งค่าเค้าโครง -> ตัวเลือกซึ่งมีรายการของปุ่มและลักษณะการทำงานทางเลือก ทำงานได้อย่างไม่มีที่ติใน Unity และ terminal
Allyl Isocyanate

1
หากคุณมีการเชื่อมต่อคีย์บอร์ดหลาย ๆ อันเครื่องมือเหล่านี้จะเห็นความแตกต่างระหว่างคีย์เดียวกันบนคีย์บอร์ดอื่นหรือไม่
stommestack

1
แปลกฉันทำทุกอย่างแล้ว แต่การแมปคีย์ของฉันยังคงรีเซ็ตหลังจากรีสตาร์ท
Costa

1
ฉันไม่คิดว่าฉันมี-eventธงใน Ubuntu 12.04 มันจะพ่นข้อผิดพลาดและไม่ได้พูดถึง "เหตุการณ์" man xevใน
isomorphismes

20

หากคุณพยายามย้ายคีย์ Shift มีขั้นตอนพิเศษไม่กี่ขั้นตอน:

 xmodmap -e "keycode 62 = Up" # Shift => Up
 xmodmap -e "keycode 111 = Shift_R" # Up => Shift
 xmodmap -e "add shift = Shift_R" # Make the new Shift key actually do shifting
 xmodmap -e "remove shift = Up" # Prevent the old Shift key from shifting
 xset r 62 # Make the new Up key autorepeat
 xset -r 111 # Prevent the new Shift key from autorepeating

+1 คำตอบที่ unix-y ที่สุดของทั้งหมดสำหรับตัวดัดแปลง (ฉันได้ทำไปแล้วกลับมาด้วย iBook 2 ของฉันเมื่อฉันต้องการให้ปุ่ม Enter มีฟังก์ชั่นของ Control_R แต่ลืมรายละเอียดไป)
rbrito

2
คำตอบที่สำคัญสำหรับผู้ใช้ที่ใช้คีย์บอร์ดบนแล็ปท็อป Lenovo
Einar Ólafsson

16

ฉันคิดว่าคุณอาจหมายถึงบางสิ่งที่แตกต่างอย่างสิ้นเชิงจาก "remap" .. แต่ฉันจะทิ้งคำตอบไว้เหมือนเดิม ... (ฉันไม่รู้วิธีกำหนดคีย์ใหม่ให้ ทำตัวเป็นคนอื่น)

ปรับปรุง : 'ภายหลัง' ของฉันได้รับการยืนยันแล้ว; (ฉันตอบคำถามผิด:) ... โปรดดูคำตอบ Wiki ชุมชนของ NES (ยอมรับด้านบน)

มีวิธีทั่วไปสองวิธีในการทำการแมปปุ่มใหม่

  • ภายในเครื่องสำหรับโปรแกรมเฉพาะ
    (สามารถใช้กุญแจสำหรับสิ่งต่าง ๆ ในแอพ / หน้าต่างที่แตกต่างกัน)
  • ทั่วโลกสำหรับผู้ใช้เฉพาะ
    (คีย์มีฟังก์ชั่นเดียวกันในทุกหน้าต่าง)

สำหรับวิธี 'โลคัลเป็นโปรแกรม' บางครั้งมีวิธีการเปลี่ยนการโยงคีย์โดยแอปเอง ...

Firefoxมี addon ที่เรียกว่าkeyconfig ... สำหรับข้อมูลบางอย่างดูโพสต์ MozillZineนี้

โปรแกรมอูบุนตูส่วนใหญ่ใช้ Gnome และมียูทิลิตี้เฉพาะในการปรับเปลี่ยนการล็อคปุ่มกดสำหรับรายการเมนูใด ๆ ของแอป Gnome เหล่านี้ ... มันถูกเรียกว่าEditable Menu Accelerator... มันเป็นเครื่องมือ 'งอน' แต่มีประสิทธิภาพมาก .. คุณสามารถเปิดใช้งานได้ มันโดยการเรียกใช้gconf-editor(ผ่าน Terminal หรือ Alt + F2) ... นำทางไปที่desktop- gnome- interfaceและเลือกcan_change_accels.... จากนั้นคุณสามารถเปลี่ยนรายการเมนูเป็นสิ่งที่คุณต้องการเสมือน (ต่อโปรแกรม / หน้าต่าง) ... ฉันขอแนะนำให้คุณปิดการใช้งาน ทันทีที่คุณทำสิ่งที่คุณต้องการ ..

มิฉะนั้นคุณสามารถตั้งค่าคีย์ลัดส่วนกลางได้ ฉันใช้โปรแกรมที่ชื่อว่าxbindkeys ติดตั้ง xbindkeysและยังมีตัวเลือกให้เลือกผ่านทางเมนูหลัก - การตั้งค่าที่เรียกว่าKeyboard Shortcuts

หากคุณใช้ xbindkeys คุณจะต้องเพิ่มลงใน "แอปพลิเคชันเริ่มต้น" ของคุณ (เมนูหลัก - การตั้งค่า) ... นอกจากนี้ (ตามที่แนะนำโดย Stefano Palazzo) ฉันได้เขียนคำอธิบายรายละเอียดเพิ่มเติมของ xbindkeys ในคำตอบนี้หน้า Askubuntu


+1 ดีมาก! ข้อเสนอแนะ: คุณควรรวมคำตอบที่ยอดเยี่ยมของคุณจากคำถามอื่นเข้ากับคำถามนี้อาจอธิบายรูปแบบการกำหนดค่าของ xbindkey เล็กน้อย
Stefano Palazzo

1
บิตเกี่ยวกับการกำหนดปุ่มอื่น ๆ จะได้รับการจัดการโดยxdotoolให้ตรวจสอบหน้าคนที่ฉันได้ใช้มันในการแก้ปัญหานี้
Stefano Palazzo

ฉันเพิ่งพบวิธีการอื่นด้วยเครื่องมือที่เรียกว่า xmodmap ร่วมกับเครื่องมือที่เรียกว่า xev ฉันไม่รู้ว่าความแตกต่างระหว่าง xmodmap และ xbindkeys คืออะไร แต่มันใช้งานได้ดีสำหรับฉัน คำแนะนำเกี่ยวกับเครื่องมือที่จะเลือกใช้ชื่อที่สองมีอะไรบ้าง? นี่คือคำแนะนำทีละขั้นตอนที่เป็นประโยชน์ซึ่งอธิบาย xmodmap และ xev ubuntuforums.org/showpost.php?p=7675138&postcount=2
NES

@NES .. ดูเหมือนว่าฉันได้ระบุจุดที่ผิดแล้ว .. คุณดูเหมือนจะต้องการทำการแมปใหม่โดยที่ปุ่มเฉพาะถูกตีความโดยระบบปฏิบัติการเช่นการตีความแป้นพิมพ์ที่ไม่ได้มาตรฐานในขณะที่ฉันอ้างถึง การตีความแป้นพิมพ์มาตรฐานและการโหลดการกำหนดคีย์เริ่มต้นมากเกินไป (ผมคิดว่าสิ่งที่คุณมีอยู่หลังจากที่มีลักษณะคล้ายกับการแลกเปลี่ยนทางด้านซ้ายและปุ่มเมาส์ขวา) .. ดีมันดูเหมือนว่าคำตอบของฉันคือการที่ดีสำหรับสิ่งที่ผิด :)
Peter.O

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

9

นี่คือวิธีที่ฉันพยายามสลับการแมปของENTERคีย์ไปยังSHIFTคีย์ (และในทางกลับกัน):

$ uname -a

รายงาน:

Linux box 2.6.32-37-generic #81-Ubuntu SMP Fri Dec 2 20:35:14 UTC 2011 i686 GNU/Linux

$ which xmodmap

รายงาน:

/usr/bin/xmodmap

$ which xev

รายงาน:

/usr/bin/xev

$ xev

(เพิกเฉยต่อห้าสิบบรรทัดถัดไป)

PRESS THE ENTER KEY (notice the third line):
KeyPress event, serial 33, synthetic NO, window 0x5600001,
    root 0x110, subw 0x0, time 263441120, (738,242), root:(771,314),
    state 0x0, keycode 36 (keysym 0xff0d, Return), same_screen YES,
    XLookupString gives 1 bytes: (0d)
    XmbLookupString gives 1 bytes: (0d)
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x5600001,
    root 0x110, subw 0x0, time 263441271, (738,242), root:(771,314),
    state 0x0, keycode 36 (keysym 0xff0d, Return), same_screen YES,
    XLookupString gives 1 bytes: (0d)
    XFilterEvent returns: False

PRESS THE SHIFT KEY (notice the third line):
KeyPress event, serial 30, synthetic NO, window 0x5600001,
    root 0x110, subw 0x0, time 263592202, (464,368), root:(497,440),
    state 0x0, keycode 62 (keysym 0xffe2, Shift_R), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x5600001,
    root 0x110, subw 0x0, time 263592298, (464,368), root:(497,440),
    state 0x1, keycode 62 (keysym 0xffe2, Shift_R), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

สิ่งสำคัญคือบรรทัดที่สามของแต่ละปุ่มกด:

FOR:
state 0x0, keycode 36 (keysym 0xff0d, Return), same_screen YES,
The name "Return" is the name of the behavior of the key pressed.
The number of the key pressed is "36".

state 0x0, keycode 62 (keysym 0xffe2, Shift_R), same_screen YES,
The name "Shift_R" is the name of the behavior of the key pressed.
The number of the key pressed is "62".

ย้อนกลับการแมป:

$ xmodmap -e "keycode 62 = Return"
$ xmodmap -e "keycode 36 = Shift_R"

บันทึกผลลัพธ์:

$ xmodmap -pke > ~/.Xmodmap
$ vi ~/.xinitrc

เพิ่ม

 xmodmap ~/.Xmodmap

$ sudo reboot

ปัญหาหลักคือการกลับรายการไม่ทำงาน ENTERคีย์แมปไปSHIFT_Rที่สำคัญ แต่SHIFT_Rคีย์ไม่ได้ถูกแมปกับENTERคีย์ ไปคิด


7

หากต้องการทำการแมปทั่วโลกโดยไม่ขึ้นกับ X คุณสามารถใช้ประโยชน์จากการตั้งค่าคอนโซล (5)แทน

ในกรณีของฉันฉันต้องการตั้งค่าCaps LockกุญแจDใหม่เนื่องจากD-key ของฉันเสีย :)

ก่อนอื่นฉันใช้dumpkeys (1)เพื่อรับแม่แบบสำหรับการแมปในกรณีของD-key บิตที่น่าสนใจคือการแมปสำหรับรหัส 32 (บนแป้นพิมพ์); โปรดสังเกตว่ามีสองช่องว่างในรูปแบบ grep!

$ sudo dumpkeys | grep "keycode  32" > tempfile
$ cat tempfile
keycode  32 = +d
    shift   keycode  32 = +D
    altgr   keycode  32 = +eth
    shift   altgr   keycode  32 = +ETH
    control keycode  32 = Control_d
    shift   control keycode  32 = Control_d
    altgr   control keycode  32 = Control_d
    shift   altgr   control keycode  32 = Control_d
(121 lines total...)

เพื่อเปลี่ยนแผนที่เพื่อใช้กับCaps Lock(รหัส 58 บนแป้นพิมพ์ของฉัน) แทน

sed 's/32/58/' -i tempfile

ตอนนี้มันอ่านแล้ว

keycode  58 = +d
    shift   keycode  58 = +D
    altgr   keycode  58 = +eth
(etc...)

ในการเพิ่มการแมปนี้ไปยังแผนที่เริ่มต้นมันจะต้องผนวกเข้ากับไฟล์การแมปการรวมสำหรับการตั้งค่าคอนโซล

sudo sh -c 'cat tempfile >> /etc/console-setup/remap.inc'

และการตั้งค่าคอนโซลจำเป็นต้องกำหนดค่าใหม่ (ข้ามคำถามที่มีลำดับความสำคัญต่ำ-phigh)

sudo dpkg-reconfigure console-setup -phigh

ตอนนี้ทำการแมปใหม่เสร็จแล้วและทำการโหลดอัตโนมัติในการบู๊ต


3

Ctrl+Pageupผมใช้เวลาหนึ่งวันทั้งในการพยายามที่จะสร้างทางลัดสำหรับ

ฉันลองครั้งแรกxmodmapแต่ไม่สามารถสร้างกิจกรรมตัวแก้ไขได้ ดังนั้นจึงเป็นไปไม่ได้ที่จะสร้างทางลัดที่สร้างตัวอย่างControlเหตุการณ์

ฉันก็พยายามด้วยxbindkeys xmacroการเรียงลำดับของงานนั้น แต่ไม่สามารถที่จะจับรวมกันที่สำคัญบางอย่างในระบบของฉันเช่นxbindkeysAlt + ___

ดังนั้นในที่สุดฉันก็ใช้แป้นพิมพ์ลัดของ Unity -> ทางลัดที่กำหนดเองเพื่อตั้งค่าทางลัดของฉัน

และแทนที่จะเป็นxmacroตอนนี้ฉันได้ใช้xvkbdโปรแกรมเพื่อสร้างเหตุการณ์แป้นพิมพ์ แต่นั่นเป็นเพียงการตั้งค่าส่วนตัว ทั้งสองxmacroและxvkbdทำงานเกือบเหมือนกัน เคล็ดลับเพิ่มเติมอีกประการหนึ่งคือการเพิ่มพารามิเตอร์การหน่วงเวลาในxmacroหรือxvkbdเพื่อให้แน่ใจว่าเหตุการณ์จะไม่สูญหาย


2

สำหรับฉัน AutoKey จาก Software Center ทำงานได้ดีที่สุด มี GUI ที่ใช้งานง่ายเพื่อเพิ่มการเชื่อมโยงใหม่คลิกใหม่ -> วลีและ

  1. เพิ่มชื่อคลิกตกลง
  2. ที่ส่วน "การตั้งค่าวลี" ตรวจสอบให้แน่ใจว่าวางการใช้ถูกตั้งค่าเป็นแป้นพิมพ์
  3. เพิ่มปุ่มลัดที่คุณต้องการใช้
  4. เพิ่มคำสั่งลงในช่องข้อความเช่นเพื่อเลียนแบบปุ่มลูกศรซ้าย - เป็น<left>(รายการของปุ่มพิเศษอยู่ที่นี่ )

นี้ทำงาน Perfekt การตั้งค่าSuper+CและSuper+VการและCtrl+C Ctrl+Vเป็นโซลูชั่นที่สมบูรณ์แบบเมื่อใช้ Ubuntu ผ่าน VirtualBox บน mac
Ben

อย่างไรก็ตามสิ่งนี้ไม่ได้ปิดการใช้งานคำสั่งอื่น ๆ ที่ฟังทางลัดเหล่านี้ หากต้องการปิดการใช้งานSuper+V"แสดงรายการการแจ้งเตือน" ให้ไปที่การตั้งค่า -> อุปกรณ์ -> แป้นพิมพ์และปิดการใช้งานที่นั่น
Ben

@Ben yup มันจะดีมากถ้ามันแสดงการเชื่อมโยงของแอพอื่น ๆ แต่มันค่อนข้างจะเป็นไอซิ่งบนเค้ก ปัญหาของฉันคือไม่สามารถทำการแมปปุ่ม "Fn" ใหม่ได้ ฉันตัดสินใจลองใช้แป้นพิมพ์ uhk - สิ่งที่โปรแกรมนี้ไม่ขึ้นอยู่กับระบบปฏิบัติการจะเห็นว่ามันเป็นอย่างไร
อัตตา

0

หากคุณต้องการทำการแมปคีย์สำหรับโปรแกรมเฉพาะเท่านั้นฉันเพิ่งเพิ่มฟีเจอร์นี้ไปยัง hax11

ฉันต้องการที่จะเปลี่ยนPgUpไปHomeหรือเพื่อPgDownEnd

ในการดำเนินการนี้ด้วย hax11 ให้เปิดไฟล์การกำหนดค่าโปรไฟล์ของโปรแกรมภายใต้~/.config/hax11/profiles(เช่น~/.config/hax11/profiles/usr\lib\firefox\firefox) และเพิ่ม:

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