พิมพ์โดยใช้คีย์ผสมหรือไม่


12

ฉันเป็นผู้ใช้ Ubuntu 10.04 ที่กำลังมองหาวิธีทำให้คอมพิวเตอร์ของฉันพิมพ์อักขระ "+" เมื่อฉันกดWindowsแป้นค้างไว้(ฉันคิดว่ามันเรียกว่าSuperในโลก Linux) และกดKแป้น ฉันต้องการสิ่งนี้เพื่อทำงานในแอปพลิเคชันทั้งหมด (ฉันเป็นคนที่มีความพิการด้านการพิมพ์และฉันต้องปรับ Ubuntu ให้เหมาะกับความต้องการของฉัน) ขอบคุณ!

คำตอบ:


15

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

ขั้นตอนที่ 0 - แนวทาง

X-server จะจัดการแป้นพิมพ์และเหตุการณ์สำคัญทั้งหมดและแปลเป็นรหัสสำหรับแอปพลิเคชันทั้งหมด

วิธีการนี้จะแมปปุ่มตัวดัดแปลง (เช่นปุ่ม Super หรือปุ่ม Alt ขวา) เป็นปุ่ม "สลับโหมด" และบอกให้ X-server สร้างรหัสที่แตกต่างกันขึ้นอยู่กับว่ามีการกดแป้นด้วยปุ่มโหมดค้างไว้หรือไม่

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

อย่างไรก็ตามฉันต้องการให้คุณพิจารณาใช้ปุ่ม Alt ขวาเป็นโหมดสลับโดยเฉพาะอย่างยิ่งถ้าคุณใช้ compiz เนื่องจากปลั๊กอิน compiz บางอันจะทำแผนที่ทางลัดคีย์ลัด (เช่นตัวเลือกหน้าต่างตัวเปลี่ยนกะ ฯลฯ ) หากคุณไม่กระตือรือร้นในการควบคุมคอมพิวเตอเรชันผ่านทางแป้นพิมพ์ Super ก็ถือว่าใช้ได้

ในการ xmodmap ซุปเปอร์คีย์จะถูกระบุเป็น Super_L หรือ Super_R คุณต้องเลือกหนึ่งอันเพื่อใช้เป็นปุ่มสลับโหมด อีกทางเลือกหนึ่งปุ่ม Alt ด้านขวาคือ Alt_R คุณสามารถยืนยันสิ่งเหล่านี้ได้ด้วยการรัน xev และกดปุ่มที่จำเป็นบนคีย์บอร์ดของคุณ ดูโพสต์นี้สำหรับขั้นตอน

ขั้นตอนที่ 1 - การตั้งค่าแผนที่ปรับปรุง

  1. เปิดเทอร์มินัล ( Applications -> Accesories -> Terminal) และเรียกใช้คำสั่งต่อไปนี้เพื่อสร้างไฟล์ด้วยการโยงคีย์ปัจจุบัน เราจะใช้สิ่งนี้เป็นจุดเริ่มต้น

    xmodmap -pke > curkeys.map
    xmodmap -pm >> curkeys.map
    
  2. เปิดสิ่งนี้ในโปรแกรมแก้ไขข้อความที่คุณชื่นชอบ gedit curkeys.map &เปิดใน gedit ในตอนท้ายของไฟล์คุณจะเห็นบางบรรทัดดังนี้:

    keycode 253 =
    keycode 254 =
    keycode 255 =
    xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):
    
    shift       Shift_L (0x32),  Shift_R (0x3e)
    lock        Caps_Lock (0x42)
    control     Control_L (0x25),  Control_R (0x69)
    mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
    mod2        Num_Lock (0x4d)
    mod3      
    mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
    mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)
    
  3. ลบบรรทัดที่ขึ้นต้นด้วย "xmodmap: สูงสุด 4 ... "

  4. แก้ไขแผนที่ตัวปรับแต่งเพื่อให้มีลักษณะเช่นนี้ ใส่คำว่า "เพิ่ม" ที่ด้านบนของแต่ละบรรทัดแล้วใส่ "=" หลังชื่อตัวดัดแปลง จากนั้นลบรหัสในวงเล็บและเครื่องหมายจุลภาค โปรดทราบว่าฉันได้ย้ายMode_switchจากmod5บรรทัดหนึ่งไปอีกmod3บรรทัดเนื่องจากว่างเปล่า ตารางที่แก้ไขควรมีลักษณะเช่นนี้ - เนื้อหาจริงจะแตกต่างกันเล็กน้อยในกรณีของคุณจากด้านล่าง (ขึ้นอยู่กับรูปแบบแป้นพิมพ์ของคุณ)

    add shift =      Shift_L  Shift_R
    add lock  =      Caps_Lock
    add control =    Control_L  Control_R
    add mod1    =    Alt_L Meta_L Alt_R 
    add mod2    =    Num_Lock
    add mod3    =    Mode_switch
    add mod4    =    Super_L Super_R Super_L Hyper_L 
    add mod5    =    ISO_Level3_Shift
    
  5. ทำการแมปปุ่มสลับโหมดทางกายภาพ เพิ่มบรรทัดแบบนี้ในตอนท้าย (แทนที่ Super_L ด้วย Super_R หรือ Alt_R หากต้องการ)

    keysym Super_L = Mode_switch
    
  6. ลบชื่อคีย์ (Super_L) ออกจากคำจำกัดความตัวแก้ไขใด ๆ สำหรับ Super_L นี่หมายถึงการลบออกจากบรรทัด mod4

    add mod4    =    Super_R Hyper_L 
    

    ตอนนี้ปุ่ม "Super" ที่ถูกต้องจะยังคงทำหน้าที่เป็นปุ่ม Super ธรรมดาในขณะที่ปุ่มซ้ายจะมีคุณสมบัติพิเศษ

  7. ตอนนี้เราจำเป็นต้องทำการแมปปุ่มใหม่เพื่อสร้างรหัสที่แตกต่างกันไม่ว่าจะกดในขณะที่กด Super_L ค้างไว้หรือไม่ แต่ละบรรทัดในไฟล์ของเราเริ่มต้นด้วยการkeycodeระบุ 4 keysyms สำหรับแต่ละคีย์ที่จะสร้างขึ้นโดยขึ้นอยู่กับว่า Mod1 (ปุ่ม Shift) และแป้นสลับโหมดถูกกดหรือไม่ ( ลิงค์ )

    !...........................................................................
    !        Key            Base              Shift           Mode    Mode+Shift
    !---------------------------------------------------------------------------
    keycode  13             = 4               dollar          4       quotedbl
    keycode  14             = 5               percent         5       colon
    keycode  15             = 6               asciicircum     6       comma
    keycode  16             = 7               ampersand       7       period
    ...
    keycode  45             = k               K               k       K
    

    ถ้าเราต้องการ Super_L + k keypress เพื่อสร้างคีย์ "+" เราจำเป็นต้องแก้ไขมันเพื่ออ่าน

    keycode  45 = k K plus plus
    

    เครื่องหมายบวกสุดท้ายจะจับคู่ Shift + Super_L + k กับเครื่องหมายบวก แต่สามารถแมปกับสิ่งอื่นได้ สำหรับแต่ละคีย์มี 1 บรรทัดที่จะแก้ไข แก้ไขบรรทัดเพิ่มเติมเพื่อทำการแมปคีย์เพิ่มเติม - ปล่อยให้ 2 รายการแรกเหมือนเดิมเพื่อรักษาพฤติกรรมการกดปุ่มปกติ

  8. บันทึกไฟล์และออกจากโปรแกรมแก้ไข

  9. ติดตั้ง keymap โดยการรันคำสั่งต่อไปนี้ในเทอร์มินัล คนแรกตั้งขึ้นสำหรับเซสชั่นนี้ที่สองทำให้มันถาวรสำหรับเซสชั่นในอนาคต

    xmodmap curkeys.map
    cp curkeys.map ~/.Xmodmap
    
  10. คุณสามารถทดสอบสิ่งนี้ได้ทันทีโดยกดปุ่มที่ดัดแปลง (เช่น Super_L + k)

ขั้นตอนที่ 3 - การเพิ่ม / แก้ไขแผนที่

เมื่อติดตั้งแผนที่ที่แก้ไขแล้วมันจะง่ายต่อการเพิ่มปุ่มใหม่

  1. ใช้xevเพื่อค้นหารหัสและ keysyms

  2. ทดสอบโดยใช้คำสั่งนี้เพื่อจับคู่กุญแจ:

    xmodmap -e "keycode <code> = <base> <shift> <new-mapping> <new-shift-mapping>"
    

    แทนที่รายการในวงเล็บเหลี่ยม (เช่น<code> <base>ฯลฯ ) ด้วยค่าที่เหมาะสม

  3. สำรองcurkeys.mapไฟล์

  4. เปิดcurkeys.mapและแก้ไขบรรทัดสำหรับรหัสที่เกี่ยวข้อง
  5. ใช้ซ้ำกับคำสั่งด้านล่าง (ไม่จำเป็นถ้าคุณทำตามขั้นตอนที่ 2)

    xmodmap curkeys.map
    cp curkeys.map ~/.Xmodmap
    

หมายเหตุ: 1 : การแก้ไขที่ทำในแป้นพิมพ์ลัด (ผ่านเช่นSystem -> Preferences -> Keyboard Shortcuts) จะส่งผลต่อแผนที่ตัวปรับแต่งและโดยทั่วไปจะหายไปในการเข้าสู่ระบบครั้งต่อไป ดังนั้นโปรดหลีกเลี่ยงสิ่งนั้น

หมายเหตุ: 2 : บางครั้งฉันได้รับข้อความแสดงข้อผิดพลาดเช่นนี้ขณะใช้วิธีนี้ ฉันไม่รู้ว่าสิ่งนี้หมายความว่าอย่างไรเหล่านี้โดยทั่วไปจะไม่เป็นอันตราย

X Error of failed request:  BadValue (integer parameter out of range for operation)
Major opcode of failed request:  118 (X_SetModifierMapping)
Value in failed request:  0x17
Serial number of failed request:  263
Current serial number in output stream:  263

ช่วยให้รายละเอียดสำหรับ xmodmap สามารถใช้ได้ที่นี่


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

1
โปรดทราบว่าในลินุกซ์มิ้นท์ 17 Xfce (หรืออย่างน้อยมี) มันจะต้องมี~/.Xmodmap, ~/.xmodmapได้รับการปฏิเสธ
zbr

2
อย่าลืมclearกุญแจที่กำลังรีเซ็ตตามunix.stackexchange.com/a/4526/2512
Andy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.