ฉันจะเขียน“ idempotent” .Xmodmap ได้อย่างไร


14

ขณะนี้ฉันมี.Xmodmapไฟล์ที่มีการเปลี่ยนแปลงของฉันCommandไปCtrlแล้วการเปลี่ยนแปลงของฉันCtrlไปSuper(ฉันใช้ Linux บน Mac)

มันทำงานได้ค่อนข้างดีเมื่อรันเพียงครั้งเดียว แต่ทำงานต่อเนื่อง (เช่นเมื่อฉันรีสตาร์ทสภาพแวดล้อมเดสก์ท็อปของฉัน (Cinnamon) จะโหลด.Xmodmapไฟล์ซ้ำ) มันจะรีเซ็ตการตั้งค่าโดยการย้อนกลับการเปลี่ยนแปลง สลับระหว่างการตั้งค่าที่ฉันต้องการและการตั้งค่าดั้งเดิมได้อย่างมีประสิทธิภาพ

ฉันจะเขียน.Xmodmapไฟล์ที่กำหนดการตั้งค่าได้เพียงครั้งเดียว แต่ไม่สามารถเปลี่ยนกลับมาทำงานต่อเนื่องได้อย่างไร นี่คือ.Xmodmapไฟล์ที่ฉันมีอยู่:

clear control
clear mod4

keycode 105 =
keycode 206 =

keycode 133 = Control_L NoSymbol Control_L
keycode 134 = Control_R NoSymbol Control_R
keycode 37 = Super_L NoSymbol Super_L

add control = Control_L
add control = Control_R

ฉันไม่เข้าใจคำถาม ฉันไม่รู้ว่า "โมดัล" มีความหมายอย่างไรที่นี่ สิ่งนี้.Xmodmapมีผลต่อปุ่มที่คุณกำลังเปลี่ยนเท่านั้นคุณต้องการทำอะไรที่แตกต่างกัน
Gilles 'ดังนั้นหยุดความชั่วร้าย'

เมื่อฉันใช้. Xmodmap มันตั้งค่าคีย์ถ้าฉันเรียกใช้อีกครั้งมันสลับพวกเขากลับ ฉันต้องการสร้าง. Xmodmap ที่ไม่ว่าผลลัพธ์ในปุ่มควบคุมและคีย์คำสั่งจะสลับกัน บางครั้งเมื่อรีสตาร์ท DE .Xmodmap จะทำงานอีกครั้งทำให้เกิดความรำคาญ
coteyr

2
@coteyr ฉันคิดว่าคำที่คุณกำลังมองหาคือ " idempotent "
Joseph R.

คำตอบ:


7

รีเซ็ตแผนที่เป็นสถานะดั้งเดิมก่อนที่จะใช้ mods ของคุณ การรีเซ็ตแบบเต็มใช้เวลาตลอดไปดังนั้นที่ดีที่สุดที่ฉันสามารถทำได้คือการกระจาย

รหัสนี้ใช้ใน.Xmodmap{.orig,.reset,.mods}กรณีที่.origไม่มีอยู่มันถูกตั้งค่าเป็นสถานะปัจจุบันและคำนวณ.resetเพื่อกู้คืนสถานะนั้นจากที่ใดก็ได้ .modsก่อนที่จะใช้

#!/bin/sh
# file xmodmap-reset

#     rm ~/.Xmodmap.orig
# beforehand to take current setup as baseline for Xmodmap.mods changes

stem=~/.Xmodmap
orig=${stem}.orig
reset=${stem}.reset
mods=${stem}.mods

# implement -pme like -pke
#
xmodmap-pme () {
  xmodmap -pm \
  | sed '
        1d
        / [^ ]/!d
        s/^[^ ][^ ]*/clear &\nadd & =/
        s/([^ ]*//g
    '
}

# save baseline if none atm
test -a $orig || {
    xmodmap  -pke
    xmodmap-pme
} > $orig

# payload, diff for commands to reset to baseline from current
{
    xmodmap  -pke
    xmodmap-pme
} \
| {
    diff -u0 $orig - \
    | sed -n '
        1,/^@@/d
        s/^[^+]clear/clear/p
        s/^-//p
      '
} > $reset
xmodmap $reset

# finally ready to apply the mods
test -a $mods && xmodmap $mods

(แก้ไข: ล้างข้อมูล)


ฉันจะลองทำดู จนถึงตอนนี้ดีมาก
coteyr

@coteyr - สิ่งนี้ได้ผลสำหรับคุณหรือไม่
slm

ไม่ใช่ฉันกำลังทดลองอยู่
coteyr

Upadate: ดูเหมือนว่าจะใช้งานได้ส่วนใหญ่ฉันยังต้องปรับแต่งสิ่งต่าง ๆ เล็กน้อย แต่อย่างน้อยการตั้งค่าจะไม่ถูกรีเซ็ตในการทำงานต่อเนื่อง
coteyr

@coteyr - หากนี่ไม่ได้แปลกใจฉันคิดว่าฉันมีวิธีอื่นที่อาจใช้งานได้ แต่มันมีส่วนร่วมมากกว่าดังนั้นฉันไม่ต้องการเขียนมันถ้ามันทำงาน เมื่อตอบกลับโปรดใส่ @ sign infront ชื่อผู้ใช้ของฉันด้วยดังนั้นฉันรู้ว่าคุณตอบกลับไม่เช่นนั้นฉันต้องกลับมาตรวจสอบอีกครั้งและอาจจะลืมไป
slm

0

ไปที่ระบบ> การตั้งค่า> xmodmap ~/.Xmodmapการประยุกต์ใช้งานเริ่มต้นและการเพิ่ม เพิ่มคำสั่ง xmodmap


สิ่งนี้ทำให้ xmodmap ทำงานทุกครั้งที่มีการรีสตาร์ท DE ซึ่งทำงานแล้วและทำให้การตั้งค่าถูกตั้งค่าจากนั้นตั้งค่ากลับมา ตัวอย่างเช่นเริ่มคอมพิวเตอร์เข้าสู่ระบบเปิดตัว DE, xmodmap ทำงาน, เกิดปัญหา DE, เริ่ม DE, xmodmap ทำงาน ตอนนี้แป้นพิมพ์ของฉันจะเลอะอีกครั้ง
coteyr


0

ฉันยังคงสับสนเล็กน้อยกับสิ่งที่คุณต้องการ แต่ฉันคิดว่ามัน:

หากคุณใส่ในของคุณ~/.Xmodmap,

clear control
clear mod4

keysym Super_L = Control_L
keysym Control_L = Super_L

add control = Control_L
add control = Control_R
add mod4 = Super_L
add mod4 = Super_R

จากนั้นทุกครั้งที่xmodmap ~/.Xmodmapมีการดำเนินการจากนั้นสลับคีย์Ctrlซ้ายและซ้าย ดังนั้นในการเรียกใช้ครั้งแรกCtrlคีย์จะทำหน้าที่เหมือนกับที่คุณกดแต่ในการเรียกใช้ครั้งที่สองมันจะกลับมาทำงานเป็นCtrlคีย์อีกครั้ง


นี่คือสิ่งที่ฉันไม่ต้องการ
coteyr

ฉันต้องการสิ่งที่ตรงกันข้ามฉันต้องการการร้องขอทุกครั้งไม่ว่าจะทำอะไรในการออกคำสั่งทำหน้าที่ควบคุมและควบคุมทำตัวเหมือนออกคำสั่ง
coteyr

เอาล่ะกันนี่คือเหตุผลที่ฉันสับสนเพราะต้นฉบับโพสต์ของคุณจะปรากฏที่จะทำสิ่งที่คุณต้องการ ...
billyjmc

แต่มันก็ไม่ได้
coteyr

ดีพฤติกรรมที่ผมสังเกตก็คือว่ารหัสของคุณคือ idempotent ขณะที่รหัสของฉันคือ stateful คุณกำลังบอกฉันว่าทั้งรหัสของคุณและของฉันมีพฤติกรรมเหมือนกันกับคุณหรือไม่? หากเป็นเช่นนั้นฉันคิดว่าคุณต้องประสบกับข้อผิดพลาดบางอย่าง ฉันมีข้อเสนอแนะ: ลองเรียกใช้xmodmap ~/.Xmodmapจาก xterm อย่างชัดเจนและดูว่ารหัสของคุณแลกเปลี่ยนคีย์กับแอปพลิเคชันซ้ำ ๆ หรือไม่ บางทีคีย์ของคุณอาจเปลี่ยนไปสู่พฤติกรรมดั้งเดิมเมื่อรีสตาร์ทของ Cinnamon ไม่ใช่เพราะเหตุผลที่คุณคิดว่าเป็น
billyjmc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.