Поменяйте местами <esc> и <caps lock> способом, который сохраняется для внешних клавиатур

8

У меня есть файл ~ / .speedswapper, который содержит следующее:

! Swap caps lock and escape
remove Lock = Caps_Lock
keysym Escape = Caps_Lock
keysym Caps_Lock = Escape
add Lock = Caps_Lock

... когда я бегу xmodmap ~/.speedswapper, это переключает escи Caps Lockключи. У меня есть эта строка в моем ~ / .profile, так что при каждом входе в систему эти ключи переключаются.

Однако , если я подключу внешнюю клавиатуру USB, эта настройка, похоже, не будет сохраняться. Клавиатура моего ноутбука работает отлично, но мне нужно снова запустить команду, чтобы внешняя клавиатура переключила две клавиши. К счастью, это не влияет на клавиатуру моего ноутбука - они синхронизируются.

Одним из решений было бы найти какой-нибудь способ запуска этой команды xmodmap всякий раз, когда подключена внешняя клавиатура, но я был бы открыт для другого решения по переключению клавиш, если оно будет более устойчивым. ОС Ubuntu 13.04.

Учитывая только что прокомментированный комментарий, похоже, что этого можно достичь, написав правило udev - я думаю, что мне нужно использовать опцию RUN, и что он должен быть запущен на / dev / hidraw0 или / dev / hidraw1, которые являются устройствами, которые появляются, когда я подключаю свою клавиатуру ... но я все еще пытаюсь обернуть голову вокруг концепции, поэтому я был бы благодарен за любую помощь от кого-то, кто знает, что они делают с udev

evilsoup
источник
Посмотрите на написание правил Udev для этого.
только что

Ответы:

3

Поскольку у вас есть эта команда ~/.profile, она будет выполняться только один раз, когда вы входите в систему. Одно, не очень элегантное, решение будет заключаться в том, чтобы поместить команду ~/.bashrcвместо вас, чтобы она запускалась каждый раз, когда вы открываете терминал.

Лучшим решением было бы определить udevправило, которое будет выполняться xmodmapпри вставке USB-клавиатуры (я использую значения, возвращенные для моей USB-клавиатуры, вам нужно будет отредактировать это решение, чтобы оно соответствовало вашему):

  1. Получите подробную информацию о вашей клавиатуре USB. Запустите эту команду с подключенной клавиатурой:

    $ /lib/udev/findkeyboards | grep USB
    USB keyboard: input/event6
    
  2. Чтобы написать udevправила, вам нужно знать, с чем они должны соответствовать. Вы можете получить это, выполнив поиск по выходным данным udevadm info --export-dbдля event6записи, или просто разобрать его напрямую так:

    udevadm info --export-db | perl -ne 'BEGIN{$/="\n\n"}print if /event6/'
    

    Это возвращает несколько строк текста, включая те, которые мы будем использовать:

    E: ID_MODEL_ID=0002
    [...]
    E: ID_VENDOR_ID=1c4f
    
  3. udevусложняется при использовании таких программ, как X xmodmap, я даже не смог заставить его работать при экспорте $DISPLAYи $XAUTHORITY. Во всяком случае, я не мог заставить его работать с вашим методом, поэтому keymapвместо этого используется мое решение . Во-первых, вам нужно выяснить коды клавиш для, Escи Caps Lockвы можете сделать это, запустив

    sudo /lib/udev/keymap -i input/event6
    

    а затем нажмите соответствующие клавиши. В моей системе это возвращает:

    scan code: 0x70029   key code: esc
    scan code: 0x70039   key code: capslock
    
  4. Создайте новое правило раскладки, содержащее эти строки:

    0x70029 capslock
    0x70039 esc
    

    и сохранить его как /lib/udev/keymaps/speedswap.

  5. Определите новое udevправило. Создайте файл с именем /etc/udev/rules.d/95-speedswap.rulesи добавьте в него следующие строки:

    ACTION=="add", 
    SUBSYSTEM=="input", 
    ATTRS{idVendor}=="1c4f", 
    ATTRS{idProduct}=="0002", 
    RUN+="keymap $name speedswap"
    

Это должно сделать это, по крайней мере, в моей системе, подключение к моему внешнему USB заставляет Escработать как Caps Lockи наоборот .

Тердон
источник
Это выглядит хорошо, и я попробую это завтра или послезавтра. Я надеялся на независимый от клавиатуры способ сделать это, но это скорее «изящная» вещь, чем настоящая потребность .
evilsoup
@evilsoup, у вас должно получиться более общее правило, попробуйте udevadm info --export-dbнесколько клавиатур и посмотрите, что у них общего. Может быть , ID_MODEL=USB_Keykoardили , ID_USB_DRIVER=usbhidно это также может вызвать правило с неправильным устройством. Вам решать.
Тердон