Bagaimana saya bisa menulis "idempotent" .Xmodmap

14

Saat ini saya memiliki .Xmodmapfile yang mengubah Commandke saya Ctrl, kemudian mengubah saya Ctrlke Super(saya menjalankan Linux pada Mac).

Ini bekerja cukup baik, ketika hanya dijalankan sekali tetapi pada menjalankan berturut-turut (misalnya ketika saya me-restart lingkungan desktop saya (Cinnamon) itu memuat kembali .Xmodmapfile) itu pada dasarnya me-reset pengaturan dengan mengembalikan perubahan. Beralih secara efektif antara pengaturan yang saya inginkan dan pengaturan asli.

Bagaimana saya bisa menulis .Xmodmapfile yang hanya menetapkan pengaturan satu kali, tetapi tidak mengubahnya kembali pada menjalankan berturut-turut? Ini .Xmodmapfile saya yang ada :

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
coteyr
sumber
Saya tidak mengerti pertanyaannya. Saya tidak tahu apa arti "modal" di sini. Ini .Xmodmaphanya memengaruhi kunci yang Anda ubah, apa yang ingin Anda lakukan secara berbeda?
Gilles 'SO- stop being evil'
Ketika saya menggunakan .Xmodmap, ia mengatur kunci, jika saya jalankan lagi itu akan mengubahnya kembali. Saya ingin membuat .Xmodmap yang tidak peduli apa yang menghasilkan kontrol dan perintah kunci yang ditukar. Terkadang saat restart DE .Xmodmap dijalankan lagi yang mengakibatkan gangguan.
coteyr
2
@coteyr Saya pikir kata yang Anda cari adalah " idempotent "
Joseph R.

Jawaban:

7

Setel ulang peta ke keadaan aslinya sebelum menerapkan mod Anda. Reset penuh membutuhkan waktu selamanya, jadi yang terbaik yang bisa saya lakukan adalah berbeda.

Kode ini menggunakan di .Xmodmap{.orig,.reset,.mods}mana jika .origtidak ada itu diatur ke keadaan saat ini, dan menghitung .resetuntuk mengembalikan keadaan itu dari mana pun harus. sebelum mendaftar .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

(edit: pembersihan)

jthill
sumber
Saya mencoba ini. Sejauh ini baik.
coteyr
@coteyr - apakah ini berhasil untuk Anda?
slm
Tidak juga saya masih bereksperimen.
coteyr
Upadate: ini tampaknya berfungsi, untuk sebagian besar saya masih harus sedikit men-tweak tetapi setidaknya pengaturan tidak diatur ulang pada menjalankan berturut-turut.
coteyr
@coteyr - jika ini tidak berhasil, saya pikir saya memiliki metode lain yang mungkin berhasil, tetapi ini lebih terlibat, jadi saya tidak benar-benar ingin menuliskannya jika ini berhasil. Saat menjawab, harap sertakan tanda @ infront nama pengguna saya jadi saya tahu Anda menjawab, kalau tidak saya harus kembali dan memeriksa dan kemungkinan besar akan lupa.
slm
0

Buka sistem> Preferensi> Aplikasi Startup dan tambahkan xmodmap ~/.Xmodmap. tambahkan perintah xmodmap

PMint
sumber
Ini menyebabkan xmodmap dijalankan setiap kali DE dimulai ulang, ini sudah berfungsi, dan menyebabkan pengaturan diatur, lalu diatur kembali. Misalnya Mulai komputer, masuk, DE diluncurkan, xmodmap dijalankan, DE macet, DE mulai, xmodmap dijalankan. Sekarang keyboard saya berantakan lagi.
coteyr
0

Saya masih sedikit bingung dengan apa yang Anda inginkan, tapi saya rasa ini:

Jika Anda memasukkan ini ke dalam ~/.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

maka setiap kali xmodmap ~/.Xmodmapdieksekusi, maka tombol kiri Ctrldan kiri bertukar. Jadi, pada doa pertama, Ctrlkuncinya bertindak seolah-olah Anda menekan , tetapi pada pemanggilan kedua, ia kembali bertindak sebagai Ctrltombol lagi.

billyjmc
sumber
Ini persis apa yang tidak saya inginkan
coteyr
Saya ingin yang sebaliknya, saya ingin setiap doa, tidak peduli apa yang menghasilkan perintah bertindak seperti kontrol dan kontrol bertindak seperti perintah.
coteyr
Oke, yah, ini sebabnya saya bingung, karena postingan asli Anda tampaknya melakukan apa yang Anda inginkan ...
billyjmc
Tapi ternyata tidak.
coteyr
Nah, perilaku saya amati adalah bahwa kode Anda adalah idempoten, sedangkan kode saya adalah stateful. Apakah Anda memberi tahu saya bahwa kode Anda dan kode saya berperilaku identik untuk Anda? Jika itu masalahnya, maka saya pikir Anda pasti mengalami semacam bug. Saya punya saran: coba jalankan secara eksplisit xmodmap ~/.Xmodmapdari xterm, dan lihat apakah kode Anda benar-benar menukar kunci dengan aplikasi berulang. Mungkin kunci Anda kembali ke perilaku asli ketika Cinnamon restart bukan karena alasan Anda pikir itu?
billyjmc