วันศุกร์ที่ 7 มีนาคม พ.ศ. 2551

xmodmap กับการเปลี่ยนความหมาย keyboard อย่างง่ายๆ

เนื่องจากเจอปัญหาในการทำงานของ keyboard บน Linux

ก็คือ เวลาที่เราต้องการใช้ shortcut key บนโปรแกรมหนึ่งๆ เราจะกด Ctrl+B, Ctrl+X และอะไรพวกนี้ ซึ่งมันจะทำงานได้ก็ต่อเมื่อเรา turn off เจ้าปุ่ม Numlock แล้วเท่านั้น
ไม่มีปัญหา โอเค ทำได้
แต่พอถึงเวลาที่จะใช้ key pad ในการป้อนข้อมูลตัวเลข
อ้าว...ต้อง turn on เจ้าปุ่ม Numlock ล่ะสิ
ทำไงดีหนอ จะได้ไม่ต้องมานั่งสลับปุ่ม Numlock ไปๆมาๆ
(จริงๆถ้าโปรแกรมมันรับ Shortcut Key โดยที่ไม่ต้องแคร์ปุ่ม Numlock ได้จะดีที่สุด - ปัญหาคือ ไม่รู้ทำยังงัย)

ดังนั้น เรามาแก้ปัญหาที่ปลายเหตุกันให้สนุกดีกว่า

เพราะว่าเรามี xmodmap อยู่นั่นเอง หุหุ

เท่าที่รู้ อย่างคร่าวๆ มันมีประโยชน์มากมายในการ re-map ปุ่ม keyboard
เช่น แก้ไขว่าแทนที่เรากดปุ่ม กไก่ ก็ให้มันส่ง ขไข่ มาแทน กไก่ ของเดิม (งงมั้ยหว่า)

นั่นเพราะว่า keyboard ใน UNIX จะมีสิ่งที่คล้ายๆ lookup table อยู่อันนึง เอาไว้ map ชุดตัวอักษร เข้ากับแป้น keyboard
(ซึ่งเวลาที่ทำการเปลี่ยนภาษา ก็คงจะทำแค่เปลี่ยนชุดภาษาเหล่านี้ล่ะมั้ง ดูง่ายๆดีนะ)

ทีนี้ ก็มาถึงตัวโปรแกรม
สถานที่อยู่ของมันก็คือ /usr/bin/xmodmap
เอ๊ะ ดูเหมือนจะมีอีกบ้านคือ /usr/share/xmodmap
อันนี้เป็น help ที่โชว์ syntax
ปกติเราจะใช้
xmodmap -pk หรือ
xmodmap -pke
เพื่อแสดง table ทั้งหมด ว่า key ใหน map ตัวอักษรอะไรอยู่
จากนั้น เราจะใช้
xmodmap -e
ในการเปลี่ยนความหมายของ key

ยกตัวอย่าง เช่น ในส่วนของ keypad
ถ้าดูที่ keycode 87 จะเห็นว่ามันเท่ากับ ข้อมูลสองอันคือ KP_End และ KP_1
ก็คือ ถ้า Numlock ปิด เวลากดปุ่มนี้จะมีความหมายว่ากด END
แต่ถ้า Numlock เปิด เวลากดปุ่มนี้จะมีความหมายว่ากด 1

ทีนี้ถ้าเราต้องการที่จะให้เวลากดปุ่มนี้ ให้มันแสดงแต่เลข 1
สิ่งที่เราต้องทำคือ
xmodmap -e "keycode 87 = KP_1"
เปลี่ยนมันซะทั้งบรรทัดเลย
เรียบร้อยแล้ว ทีนี้เวลากด key 1 ไม่ว่า Numlock จะเปิดหรือปิดอยู่ ก็จะส่งเลข 1 ออกมาเท่านั้น