Como mapear CTRL + A, CTRL + E para funcionar como Home, End system-wide?

4

Existe uma maneira de mapear CTRL + A e CTRL + E para trabalhar em todo o sistema como mover para o início da linha e passar para o final da linha correspondente?

Ou seja. Eu gostaria que esses atalhos funcionassem perfeitamente em qualquer aplicativo, não apenas no terminal (ou seja, como no OSX).

Meu sistema principal é o Ubuntu com o desktop Unity, mas seria bom ter uma solução universal que fosse independente de desktop, ou pelo menos suportada no Gnome, XFCE e LXDE.

    
por ccpizza 08.12.2015 / 23:01

1 resposta

3

xmodmap pode parecer uma resposta, mas não não, porque os códigos de teclas que manipula são chaves existentes no teclado, não chaves modificadas . Um controle A é uma chave modificada.

xmodmap só pode reatribuir códigos de tecla existentes ou (seus nomes) keysyms, conforme listado em sua página de manual:

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

Para ver os códigos de teclas que o xmodmap conhece, execute

xmodmap -pk

que mostra algo assim (encurtado para maior clareza):

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 mostra o que realmente acontece:

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

O modificador de controle é o 0x4 no estado; o XLookupString (uma das várias funções relacionadas para combinar eventos chave) transforma o keysym para "a" em ^A (control / A).

Como não há keysym para nenhuma das chaves de controle, reatribuir códigos de teclas usando xmodmap não será possível para o problema do OP.

Para resolver o problema do OP, é preciso ter uma maneira de dizer ao sistema operacional (essencialmente) que se recusem a entregar eventos separados para control e A - mas o Linux e o X não funcionam assim. Limitando o escopo a uma aplicação específica (xterm) ou a um conjunto de aplicativos (programas baseados em Gtk), pode-se abordar os separadamente. Mas uma solução que se aplica a todo o sistema não parece factível.

    
por 08.12.2015 / 23:29