Làm cách nào tôi có thể viết một bản idempotent khác .Xmodmap


14

Hiện tại tôi có một .Xmodmaptệp thay đổi Commandthành Ctrl, sau đó thay đổi Ctrlthành Super(Tôi đang chạy Linux trên máy Mac).

Nó hoạt động khá tốt, khi chỉ chạy một lần nhưng trên các lần chạy liên tiếp (ví dụ khi tôi khởi động lại môi trường máy tính để bàn (Cinnamon), nó tải lại .Xmodmaptệp), về cơ bản nó sẽ thiết lập lại các cài đặt bằng cách hoàn nguyên các thay đổi. Hiệu quả chuyển đổi giữa thiết lập mong muốn của tôi và thiết lập ban đầu.

Làm cách nào tôi có thể viết một .Xmodmaptệp chỉ thiết lập cài đặt một lần, nhưng không thay đổi chúng trở lại trong các lần chạy liên tiếp? Đây là .Xmodmaptập tin hiện có của tôi :

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

Tôi không hiểu câu hỏi. Tôi không có ý tưởng gì về ý nghĩa của Modal ở đây. Điều này .Xmodmapchỉ ảnh hưởng đến các khóa mà bạn đang thay đổi, bạn muốn làm gì khác đi?
Gilles 'SO- ngừng trở nên xấu xa'

Khi tôi sử dụng .Xmodmap, nó sẽ đặt các khóa, nếu tôi chạy lại, nó sẽ chuyển chúng trở lại. Tôi muốn tạo một .Xmodmap mà không có vấn đề gì dẫn đến các phím điều khiển và lệnh bị tráo đổi. Đôi khi, khi khởi động lại, DE .Xmodmap sẽ chạy lại dẫn đến sự khó chịu.
coteyr

2
@coteyr Tôi nghĩ rằng từ bạn đang tìm kiếm là " idempotent "
Joseph R.

Câu trả lời:


7

Đặt lại bản đồ về trạng thái ban đầu trước khi áp dụng các mod của bạn. Một thiết lập lại đầy đủ mất mãi mãi, vì vậy tốt nhất tôi có thể đưa ra là khác nhau.

Mã này sử dụng .Xmodmap{.orig,.reset,.mods}khi .origkhông tồn tại, nó được đặt ở trạng thái hiện tại và tính toán .resetđể khôi phục trạng thái đó từ bất kỳ nơi nào nó đến. trước khi áp dụng .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

(chỉnh sửa: dọn dẹp)


Tôi đang thử cái này Càng xa càng tốt.
coteyr

@coteyr - cái này có phù hợp với bạn không?
slm

Không thực sự tôi vẫn đang thử nghiệm.
coteyr

Upadate: điều này dường như đang hoạt động, phần lớn tôi vẫn phải điều chỉnh mọi thứ một chút nhưng ít nhất các cài đặt không được thiết lập lại trong các lần chạy liên tiếp.
coteyr

@coteyr - nếu điều này không thành công Tôi nghĩ rằng tôi có một phương pháp khác có thể hiệu quả, nhưng nó liên quan nhiều hơn, vì vậy tôi không thực sự muốn viết nó lên nếu điều này thực hiện được. Khi trả lời, vui lòng bao gồm ký hiệu @ trước tên người dùng của tôi để tôi biết bạn đã trả lời, nếu không tôi phải quay lại và kiểm tra và rất có thể sẽ quên.
slm

0

Chuyển đến hệ thống> Tùy chọn> Ứng dụng khởi động và thêm xmodmap ~/.Xmodmap. thêm lệnh xmodmap


Điều này khiến xmodmap chạy mỗi khi DE được khởi động lại, điều này đã hoạt động và khiến các cài đặt được đặt, sau đó đặt lại. Ví dụ: Khởi động máy tính, đăng nhập, DE được khởi chạy, xmodmap được chạy, DE gặp sự cố, DE bắt đầu, xmodmap được chạy. Bây giờ bàn phím của tôi lại bị rối.
coteyr


0

Tôi vẫn còn bối rối một chút về những gì bạn muốn, nhưng tôi nghĩ rằng nó:

Nếu bạn đặt cái này trong ~/.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

sau đó mỗi lần xmodmap ~/.Xmodmapđược thực thi, sau đó trao đổi khóa Ctrltrái và trái . Vì vậy, trong lần gọi đầu tiên, Ctrlkhóa hoạt động như thể bạn đã nhấn , nhưng ở lần gọi thứ hai, nó lại tiếp tục hoạt động như một Ctrlkhóa.


Đây chính xác là những gì tôi không muốn
coteyr

Tôi muốn hoàn toàn ngược lại, tôi muốn mọi lời mời, bất kể điều gì dẫn đến lệnh hoạt động như điều khiển và điều khiển hành động như lệnh.
coteyr

Được rồi, đây là lý do tại sao tôi bối rối, bởi vì bài đăng ban đầu của bạn dường như làm chính xác những gì bạn muốn ...
billyjmc

Nhưng nó không.
coteyr

Chà, hành vi tôi quan sát là mã của bạn idempotent, trong khi mã của tôi là trạng thái. Bạn đang nói với tôi rằng cả mã của bạn và của tôi đều hoạt động giống hệt bạn? Nếu đó là trường hợp, thì tôi nghĩ bạn phải gặp một lỗi nào đó. Tôi có một gợi ý: hãy thử chạy một cách rõ ràng xmodmap ~/.Xmodmaptừ xterm và xem mã của bạn có thực sự trao đổi các khóa với ứng dụng lặp đi lặp lại không. Có lẽ các khóa của bạn trở lại hành vi ban đầu khi Cinnamon khởi động lại không phải là lý do bạn nghĩ vậy?
billyjmc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.