4

Есть ли способ сопоставить CTRL+A и CTRL+E для работы в масштабе всей системы, как перемещение к началу строки и соответственно перемещение к концу строки?

Т.е. Я хотел бы, чтобы эти ярлыки работали без проблем в любом приложении, а не только в терминале (то есть, как в OSX).

Моя основная система - Ubuntu с рабочим столом Unity, но было бы хорошо иметь универсальное решение, которое не зависело бы от рабочего стола или, по крайней мере, поддерживалось бы в Gnome, XFCE и LXDE.

1 ответ1

3

Может показаться, что xmodmap дает ответ, но это не так, потому что коды клавиш, которыми он манипулирует, являются существующими клавишами на клавиатуре, а не измененными клавишами. Элемент управления A является модифицированным ключом.

xmodmap может переназначать только существующие коды клавиш (или их имена), как указано на странице руководства:

keycode NUMBER = KEYSYMNAME ...
keycode any = KEYSYMNAME ...
keysym KEYSYMNAME = KEYSYMNAME ...

Чтобы увидеть коды клавиш, о которых знает xmodmap , запустите

xmodmap -pk

который показывает что-то вроде этого (сокращено для ясности):

There are 4 KeySyms per KeyCode; KeyCodes range from 8 to 255.

    KeyCode Keysym (Keysym) ...
    Value   Value   (Name)  ...

      8     0x0061 (a)      0x0041 (A)      0x00e5 (aring)  0x00c5 (Aring)  
      9     0x0073 (s)      0x0053 (S)      0x00df (ssharp) 0x00cd (Iacute) 
     10     0x0064 (d)      0x0044 (D)      0x08ef (partialderivative)      0x00ce (Icircumflex)    
     11     0x0066 (f)      0x0046 (F)      0x08f6 (function)       0x00cf (Idiaeresis)     
     12     0x0068 (h)      0x0048 (H)      0x01ff (abovedot)       0x00d3 (Oacute) 
     13     0x0067 (g)      0x0047 (G)      0x00a9 (copyright)      0x01bd (doubleacute)    
     14     0x007a (z)      0x005a (Z)      0x07d9 (Greek_OMEGA)    0x00b8 (cedilla)
     ...

xev показывает, что на самом деле происходит:

KeyPress event, serial 34, synthetic NO, window 0xc00001,
    root 0x111, subw 0xc00002, time 2209364614, (27,43), root:(47,86),
    state 0x4, keycode 8 (keysym 0x61, a), same_screen YES,
    XLookupString gives 1 bytes: (01) "^A"
    XmbLookupString gives 1 bytes: (01) "^A"
    XFilterEvent returns: False

KeyRelease event, serial 34, synthetic NO, window 0xc00001,
    root 0x111, subw 0xc00002, time 2209364773, (27,43), root:(47,86),
    state 0x4, keycode 8 (keysym 0x61, a), same_screen YES,
    XLookupString gives 1 bytes: (01) "^A"
    XFilterEvent returns: False

Модификатор управления - 0x4 в состоянии; XLookupString (одна из нескольких связанных функций для комбинирования событий клавиш) преобразует ключевую фразу для "a" в ^A (control/A).

Поскольку ни для одной из управляющих клавиш не используется keyym, переназначение кодов клавиш с помощью xmodmap не будет возможным для проблемы OP.

Чтобы решить проблему OP, нужно было бы указать операционной системе (по существу) отказаться от предоставления отдельных событий для контроля и A - но Linux и X не работают таким образом. Ограничивая область действия определенным приложением (xterm) или набором приложений (программы на основе Gtk), можно обратиться к ним отдельно. Но решение, которое применяется в масштабе всей системы, не представляется выполнимым.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .