केवल एक विशेष कीबोर्ड के लिए लिनक्स के तहत चाबियाँ कैसे रिमैप करें


18

मैंने हाल ही में एक यूनिकॉम्‍प कीबोर्ड खरीदा है जो स्वैप-राइट-ऑल्ट और विंडोज कीज़ के साथ आता है। कीबोर्ड lsusb पर इस तरह की पहचान करता है:

Bus 003 Device 002: ID 17f6:0822 Unicomp, Inc 

क्या कर्नेल रखने का कोई तरीका है (यानी xmodmap- आधारित नहीं) दाईं-alt और विंडोज़ कीज़ को स्वैप करें ताकि हर एप्लिकेशन उन्हें स्वैप की गई जगहों पर देख सके, भले ही उन्हें कच्चा कीबोर्ड इनपुट मिले (xmodmap के साथ स्वैपिंग सामान ऐसा नहीं होगा) ? वहाँ एक तरीका है कि केवल इस एक कीबोर्ड के लिए है?


मुझे संदेह है कि आप कीबोर्ड के सीरियल नंबर का मिलान करके udv के साथ ऐसा कर सकते हैं और फिर एक स्क्रिप्ट को कॉल कर सकते हैं जो रीमैपिंग करता है। आपको इसे वापस लगाने के लिए डिवाइस के लिए अलग से एक समान स्क्रिप्ट की आवश्यकता होगी।
जाम

1
@ Jam क्या यह सभी संलग्न कीबोर्ड रीमैप होगा? मैं कल्पना नहीं कर सकता कि लिनक्स इतना अनम्य है कि यह केवल सभी संलग्न (यूएसबी) कीबोर्ड के लिए एक मैपिंग टेबल का प्रबंधन कर सकता है।
फ़ूजएक्सएक्सएल

@ इसके अलावा, आप वास्तव में मेरी मदद करेंगे यदि आप वर्णन कर सकते हैं कि वास्तविक स्वैपिंग कैसे करें। मैंने इस पर कुछ भी उपयोगी खोजने का प्रबंधन नहीं किया, केवल xmodmap सामान (जिसका मैं उपयोग नहीं करना चाहता)।
फ़ूजएक्सएक्सएल

यदि आप xmodmap का उपयोग नहीं करना चाहते हैं, तो आप जो पूछ रहे हैं, वह मेरे ज्ञान के लिए बहुत विशिष्ट प्रतीत होता है ताकि आपको खेद हो। जिस विधि का मैंने प्रस्ताव किया है वह सभी उपकरणों के लिए कीमोड्स को स्वैप करने के लिए xmodmap का उपयोग करेगा, जिस अवधि के लिए आपका विशिष्ट कीबोर्ड संलग्न है, और फिर इसे वापस रख दें। क्या आप एक साथ कई कीबोर्ड का उपयोग करने की उम्मीद कर रहे हैं?
जाम

@jam यदि मैंने Xmodmap का उपयोग किया है, तो X प्रोग्राम्स में अभी भी गलत कीकोड दिखाई देंगे क्योंकि X सर्वर क्लाइंट को अनट्रांसलेटेड कुंजी कोड भी भेजता है। यह वीडियो गेम के लिए उदाहरण के लिए मायने रखता है। कर्नेल में एक समाधान माना जाता है जो स्कैन कोड को पढ़ने वाले अनुप्रयोगों के साथ मेरे जीवन को अधिक जटिल नहीं बनाता है।
फ़ूजएक्सएक्सएल

जवाबों:


27

हां, XKB का उपयोग करना संभव है। एक्समॉडमैप के विपरीत, एक्सकेबी व्यक्तिगत उपकरणों के लिए आपकी चाबियाँ फिर से तैयार कर सकता है।

नोट: सुनिश्चित करें कि आपके पास xkbcomp> 1.2.0 है

पहले अपने उपकरणों को इसके साथ सूचीबद्ध करें:

xinput list

आपको कुछ इस तरह मिलेगा:

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen stylus               id=11   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger touch             id=12   [slave  pointer  (2)]
⎜   ↳ Logitech USB-PS/2 Optical Mouse           id=13   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen eraser               id=14   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger pad               id=15   [slave  pointer  (2)]
⎜   ↳ GASIA USB KB V11                          id=17   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=8    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=9    [slave  keyboard (3)]
    ↳ Logitech G19 Gaming Keyboard              id=10   [slave  keyboard (3)]
    ↳ GASIA USB KB V11                          id=16   [slave  keyboard (3)]

अपने डिवाइस के स्ट्रिंग को पहचानें और निम्न शेल स्क्रिप्ट को संपादित करें, जो आपके डिवाइस के नाम को फिट करता है, उसके साथ sed लाइन को बदलना। फिर उन कुंजियों को बदलें जिनकी आपको आवश्यकता है।

उदाहरण: xevउस कुंजी को लोड करें और दबाएं जिसे आप रीमैप करना चाहते हैं। मान लीजिए आपको पता है कि यह कीकोड 84 है । https://gist.github.com/zoqaeski/3880640 में लुकअप 84 । वहाँ प्रमुख नाम है <KP5>। फिर उस कुंजी को देखें जिसे आप चाहते हैं कि (उसी लिंक में, नीचे से आगे ) द्वारा प्रतिस्थापित किया गया है और कोष्ठक के अंदर क्या है उसे कॉपी करें। अपनी इच्छित सभी कुंजी के लिए प्रक्रिया को दोहराएं।

remote_id=$(
    xinput list |
    sed -n 's/.*GASIA.*id=\([0-9]*\).*keyboard.*/\1/p'
)
[ "$remote_id" ] || exit

# remap the following keys, only for my custom vintage atari joystick connected
# through an old USB keyboard:
#
# keypad 5 -> keypad 6
# . -> keypad 2
# [ -> keypad 8
# left shift -> left control

mkdir -p /tmp/xkb/symbols
# This is a name for the file, it could be anything you
# want. For us, we'll name it "custom". This is important
# later.
#
# The KP_* come from /usr/include/X11/keysymdef.h
# Also note the name, "remote" is there in the stanza
# definition.
cat >/tmp/xkb/symbols/custom <<\EOF

xkb_symbols "remote" {
    key <KP5>  { [ KP_Right, KP_6, U2192, U21D2 ]       };
    key <I129> { [ KP_Down, KP_2, U2193, U21D3 ]       };
    key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ]  };
    key <LFSH> { [ Control_L ]        };
};
EOF

# (1) We list our current definition
# (2) Modify it to have a keyboard mapping using the name
#     we used above, in this case it's the "remote" definition
#     described in the file named "custom" which we specify in
#     this world as "custom(remote)".
# (3) Now we take that as input back into our definition of the
#     keyboard. This includes the file we just made, read in last,
#     so as to override any prior definitions.  Importantly we 
#     need to include the directory of the place we placed the file
#     to be considered when reading things in.
#
# Also notice that we aren't including exactly the 
# directory we specified above. In this case, it will be looking
# for a directory structure similar to /usr/share/X11/xkb
# 
# What we provided was a "symbols" file. That's why above we put
# the file into a "symbols" directory, which is not being included
# below.
setxkbmap -device $remote_id -print \
 | sed 's/\(xkb_symbols.*\)"/\1+custom(remote)"/' \
 | xkbcomp -I/tmp/xkb -i $remote_id -synch - $DISPLAY 2>/dev/null

फिर इसे स्रोत (आप इसे अपने .xinitrc में जोड़ सकते हैं)। सब कुछ कर दिया! अब चाबियाँ दबाकर वांछित आउटपुट उत्पन्न करना चाहिए, केवल आपके द्वारा निर्दिष्ट डिवाइस के लिए।

संपादित करें : हाल ही में, मैंने देखा है कि, किसी कारण से, नया कॉन्फ़िगरेशन तुरंत लागू नहीं होता है। आपको पहले अपने अन्य कीबोर्ड पर एक कुंजी दबानी होगी , फिर अपने संशोधित कीबोर्ड पर कॉन्फ़िगर की हुई कुंजियों का परीक्षण करना होगा। मुझे नहीं पता कि ऐसा क्यों होता है, शायद किसी प्रकार का कैश।


जब मैं उस कंप्यूटर पर वापस जाता हूं, जहां मैं इस कीबोर्ड का उपयोग करता हूं, तो मैं इसे आजमाता हूं।
फ़ूजएक्सएक्सएल

1
a) sed -n 's/.*G19 Gaming Keyboard.*id=\([0-9]*\).*keyboard.*/\1/p' c) हां, आपको $remote_idआईडी नंबर के साथ पहली बार इसे बदलना चाहिए । ध्यान दें कि वहाँ दो संदर्भ हैं $remote_id, क्या आपने दोनों को बदल दिया है?
वाटकॉम

1
ओह, और जब हार्ड-कोडेड का परीक्षण करते हैं $remote_id, तो सुनिश्चित करें कि आपने टिप्पणी को बाहर [ "$remote_id" ] || exitकर दिया है यदि आपने पहले से ही अन्यथा नहीं किया है तो यह बस जमानत कर देगा।
वाटकॉम

1
@ आँकड़े-एचबी $9काम नहीं करेगा, आपका मतलब है 9?
वाटकॉम

1
मेरे लिए यह काम करता है lampjs.wordpress.com/2015/06/26/...
usil

6

किसी अन्य व्यक्ति के लिए जो Google से यहां आ रहा है और प्रश्नकर्ता के लिए मूल रूप से क्या उम्मीद कर रहा था, के साथ अधिक जवाब चाहता है, मुझे इस evdevस्तर पर घटनाओं को हटाने के दो तरीकों के बारे में पता है ताकि परिवर्तन सभी अनुप्रयोगों पर लागू हो:

  1. udev हार्डवेयर डेटाबेस प्रविष्टियों को संशोधित करने के लिए एक एपीआई प्रदान करता है जो स्कैन्कोड और कीकोड के बीच मैपिंग को नियंत्रित करता है। यह ArchiWiki पृष्ठ , जिसमें निर्देश हैं, स्पष्ट रूप से कहता है कि यह X11 और कंसोल इनपुट दोनों के लिए काम करेगा।

    जिस्ट यह है कि आप एक कस्टम प्रविष्टि बनाते /etc/udev/hwdb.d/हैं जिसमें एक डिवाइस मैच पैटर्न और कुछ स्कैन्कोड-टू-कीकोड रीमैपिंग परिभाषाएँ होती हैं, फिर systemd-hwdb updateडेटाबेस को फिर से बनाने और udevadm triggerरिबूट के बिना इसे लागू करने के लिए चलाते हैं ।

  2. यह देखते हुए कि वेलैंड X11 के कीबोर्ड सबसिस्टम और प्रमुख अर्थलैंड कंपोजिटर्स का उपयोग नहीं करता है जैसे कि GNOME शेल और वेस्टन यूबी को लिबिनपुट के प्रासंगिक पहलुओं को कॉन्फ़िगर करने के लिए लागू नहीं करते हैं, किसी ने डेवडेमरेपेक नाम का एक डेमन लिखा है जो लॉजिटेक के लिए G15Daemon यूजर्सस्पेस ड्राइवर के लिए समस्या को हल करता है। G15 गेमिंग कीबोर्ड।

    (यह उन घटनाओं को निगलता है जो इसे फिर से शुरू करने का इरादा रखते हैं, इसलिए डिवाइस पर सुनने वाले और कुछ भी उन्हें नहीं देख सकते हैं, फिर uinputउपयोक्ता के द्वारा कर्नेल-स्तरीय इनपुट डिवाइस बनाने के लिए एपीआई के माध्यम से सही घटनाओं का उत्सर्जन करता है ।)


मैं यहाँ से आ रहा हूँ DuckDuckGo, लेकिन वैसे भी उत्तर के लिए धन्यवाद (:
sm4rk0

0

@Watcom विकल्प के साथ सफल नहीं होने वालों के लिए, बस अपनी नई मैपिंग फ़ाइल डालें, जैसे:

xkb_symbols "remote" {
    key <KP5>  { [ KP_Right, KP_6, U2192, U21D2 ]       };
    key <I129> { [ KP_Down, KP_2, U2193, U21D3 ]       };
    key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ]  };
    key <LFSH> { [ Control_L ]        };
};

/ usr / share / X11 / xkb / प्रतीकों / के रूप में शायद रूट (ubuntu, आपके distrib के लिए अलग हो सकता है), फ़ाइल 'कस्टम' को कॉल करें। इसके साथ अपने वर्तमान लेआउट स्ट्रिंग के लिए पूछें setxkbmap -device <device id> -print | grep xkb_symbolsऔर इसमें जोड़ें +custom। संशोधित लेआउट स्ट्रिंग के साथ रीमैप्ड कीज़ के साथ नया लेआउट सेट करें:

setxkbmap -device <device id> -layout "us+ru:2+us:3+inet(evdev)+capslock(grouplock)+custom"

प्रभाव स्थायी नहीं होता है और दुर्भाग्य से रीसेट करता है जब अन्य कीबोर्ड जुड़ा होता है, तो यह पता नहीं लगाया जाता है कि इसे कैसे ठीक किया जाए। आप अपने ऊपर दिए गए आदेश को जोड़ सकते हैं .bashrc, लेकिन यदि आवश्यक हो तो पुनः आरंभ करने पर चाबियाँ बदली जाती हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.