Como mapear CTRL+A, CTRL+E para funcionar como Home, End em todo o sistema?

Como mapear CTRL+A, CTRL+E para funcionar como Home, End em todo o sistema?

Existe uma maneira de mapear CTRL+A e CTRL+E para funcionarNo âmbito do sistemacomo mover para o início da linha e mover para o final da linha correspondentemente?

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 do desktop, ou pelo menos fosse suportada no Gnome, XFCE e LXDE.

Responder1

xmodmappode parecer fornecer uma resposta, mas não o faz, porque ocódigos-chaveele manipula são teclas existentes no teclado, nãomodificadochaves. A controlAé uma chave modificada.

xmodmapsó pode reatribuir códigos-chave existentes ou (seus nomes) keysyms, conforme listado em sua página de manual:

keycode NÚMERO=CHAVESYMNAME...
keycode any=CHAVESYMNAME...
keysym CHAVESYMNAME=CHAVESYMNAME...

Para ver os códigos-chave que xmodmapvocê conhece, execute

xmodmap -pk

que mostra algo assim (abreviado 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)
     ...

xevmostra 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 está 0x4no estado; o XLookupString(uma das várias funções relacionadas para combinar eventos principais) transforma osímbolo de teclapara "a" em ^A(controle/A).

Como não há símbolo de chave para nenhuma das teclas de controle, a reatribuição de códigos de tecla usando xmodmapnão será possível para o problema do OP.

PararesolverPara o problema do OP, seria necessário encontrar uma maneira de dizer ao sistema operacional para (essencialmente) se recusar a entregar eventos separados para controle A- mas Linux e X não funcionam dessa maneira. Limitando o escopo a uma aplicação específica (xterm) ou conjunto de aplicações (programas baseados em Gtk), pode-se abordá-los separadamente. Mas uma solução que se aplique a todo o sistema não parece viável.

informação relacionada