Mapeando Super + hjkl para as teclas de seta em X


23

Estou tentando mapear:

Super+h -> Left
Super+j -> Down
Super+k -> Up
Super+l -> Right

globalmente no X. A idéia é que não quero deixar minha linha inicial com tanta frequência para usar as teclas de seta, então usarei o Super modificador + hjkl para emular as teclas de seta no X. Existe alguma maneira de fazer isso ?

Uma coisa que eu tentei é xbindkeys + xte usando esta configuração:

"xte 'keydown Up' 'keyup Up'"
  Mod4+k

"xte 'keydown Down' 'keyup Down'"
  Mod4+j

"xte 'keydown Left' 'keyup Left'"
  Mod4+h

"xte 'keydown Right' 'keyup Right'"
  Mod4+l

mas parece haver um grande atraso entre eu pressionar a tecla e perceber qualquer resultado, e na maioria das vezes nada acontece.

Existe uma maneira mais elegante de fazer isso que realmente funcione sem demora?



O que é o sistema operacional? Eu também acho que você pode estar melhor usando Control-Super ou algum desses combo.
harrymc

Respostas:


15

Capslock + HJKL para teclas de seta

  1. Crie ~ / .Xmodmap e coloque isso dentro:

    clear Lock 
    keycode 66 = ISO_Level3_Shift
    
  2. Adicionar Left, Down, Up, Rightcomo um terceiro elemento para os h, j, k, l entradas principais em /usr/share/X11/xkb/symbols/us(a primeira secção):

    key { [ h, H, Left, Left ] }; 
    key { [ j, J, Down, Down ] };
    key { [ k, K, Up, Up ] }; 
    key { [ l, L, Right, Right ] };
    
  3. corre xmodmap ~/.Xmodmap

Alternativa: Capslock como Control e Control_L + HJKL para as teclas de seta

Esta é a minha configuração atual. Desmapeei Control_L como uma chave de controle e o uso como um modificador especial (ISO_Level3_Shift), que corresponde à terceira entrada no /usr/share/X11/xkb/symbols/usarquivo para os mapeamentos hjkl.

  1. Modifiquei a primeira estrofe de / usr / share / X11 / xkb / symbols / us como antes:

    key { [ h, H, Left, Left ] }; 
    key { [ j, J, Down, Down ] };
    key { [ k, K, Up, Up ] }; 
    key { [ l, L, Right, Right ] };
    
  2. Então eu coloquei isso no meu arquivo ~ / .Xmodmap:

    clear Control
    keycode 66 = Control_L
    add Control = Control_L
    add Control = Control_R
    keycode 37 = ISO_Level3_Shift
    

keycode 66é capslock e keycode 37é deixado o controle

  1. execute xmodmap ~ / .Xmodmap

Com essa configuração, posso usar as teclas de setas com Control_L + hjkl, além de pular as palavras com Control_L + caps + hl. Fácil!


11
Isso funciona no Arch Linux também, mas não imediatamente após o comando xmodmap. Após a reinicialização, funciona quase perfeitamente. Apenas não é possível fazer CTRL + SHIFT + seta com CTRL + SHIFT + CAPS + hjkl, geralmente para selecionar palavras. Alguma idéia de como fazer isso?
Koss

Hmm, você está certo, o melhor que eu poderia fazer é adicionar Esquerda, Baixo, Cima, Direita novamente em outra coluna. Isso não faz com que o destaque funcione, mas ignorará as palavras normalmente. Vou ter que investigar isso mais.
William Casarin

Isso funciona bem o suficiente para mim. O único problema que tenho, ele não funciona no Chrome e isso é um incômodo.
Mood

Pode ser necessário limpar os arquivos xkb em cache /var/lib/xkb/*.xkmpara que as alterações /usr/share/X11/xkb/symbols/usentrem em vigor.
solo de

11
Isso funciona no Ubuntu 14.04. Eu tive que fazer xmodmap /home/alex/.Xmodmapum aplicativo de inicialização e remover todos os arquivos * .xkm do formulário / var / lib / xkb. Aviso: lixeira uma VM do Ubuntu executando esta última etapa e, em seguida, meu teclado não funcionaria mais, portanto, tenha cuidado e tenha um backup pronto :-) Shift + Control + Caps + hjkl para selecionar o texto funciona bem no Firefox e Thunderbird, mas em algumas aplicações, não (Chrome, por exemplo)
Alexander Rechsteiner

8

As alterações acima mencionadas em / usr / share / X11 / xkb / symbols / us NÃO funcionam para mim:
Erro ao carregar a nova descrição do teclado

Mas, depois de analisar vários howtos contraditórios, encontrei uma solução, que mapeia a tecla super esquerda (tecla esquerda do Windows / Mod4) em combinação com o hjkl para esquerda, baixo, cima, direita. Essa é uma configuração para todo o sistema.

Adicione este bloco ao final da primeira seção (logo antes };) do seu / usr / share / X11 / xkb / symbols / us :

//hjkl
//AltGr + hjkl
key <AC06> {        [         h, H, Left            ]       };
key <AC07> {        [         j, J, Down            ]       };
key <AC08> {        [         k, K, Up              ]       };
key <AC09> {        [         l, L, Right           ]       };
//Super_L -> Alt Gr
key <LWIN> { [ ISO_Level3_Shift ] }; //see below!

A primeira linha-chave mapeia AltGr + h para a esquerda.
A última linha da tecla faz com que a super tecla esquerda se comporte como AltGr.
Aqui está:

Super + h -> Esquerda
Super + j -> Abaixo
Super + k -> Acima
Super + l -> Direita

Para aplicar as novas configurações, execute setxkbmap ou reinicie o sistema.

Importante : Isso obviamente desativa a super chave, portanto, se você estiver realmente usando sua super chave para outros fins (por exemplo, mover uma janela para outra área de trabalho), não deverá remapear dessa maneira.
Para usar o Caps Lock em vez de Super, altere a última linha da tecla com:

key <CAPS> { [ ISO_Level3_Shift ] };

Aqui está a primeira seção completa do meu arquivo de configuração:

default
partial alphanumeric_keys modifier_keys
xkb_symbols "basic" {

    name[Group1]= "English (US)";

    // Alphanumeric section
    key <TLDE> {        [     grave,    asciitilde      ]       };
    key <AE01> {        [         1,    exclam          ]       };
    key <AE02> {        [         2,    at              ]       };
    key <AE03> {        [         3,    numbersign      ]       };
    key <AE04> {        [         4,    dollar          ]       };
    key <AE05> {        [         5,    percent         ]       };
    key <AE06> {        [         6,    asciicircum     ]       };
    key <AE07> {        [         7,    ampersand       ]       };
    key <AE08> {        [         8,    asterisk        ]       };
    key <AE09> {        [         9,    parenleft       ]       };
    key <AE10> {        [         0,    parenright      ]       };
    key <AE11> {        [     minus,    underscore      ]       };
    key <AE12> {        [     equal,    plus            ]       };

    key <AD01> {        [         q,    Q               ]       };
    key <AD02> {        [         w,    W               ]       };
    key <AD03> {        [         e,    E               ]       };
    key <AD04> {        [         r,    R               ]       };
    key <AD05> {        [         t,    T               ]       };
    key <AD06> {        [         y,    Y               ]       };
    key <AD07> {        [         u,    U               ]       };
    key <AD08> {        [         i,    I               ]       };
    key <AD09> {        [         o,    O               ]       };
    key <AD10> {        [         p,    P               ]       };
    key <AD11> {        [ bracketleft,  braceleft       ]       };
    key <AD12> {        [ bracketright, braceright      ]       };

    key <AC01> {        [         a,    A               ]       };
    key <AC02> {        [         s,    S               ]       };
    key <AC03> {        [         d,    D               ]       };
    key <AC04> {        [         f,    F               ]       };
    key <AC05> {        [         g,    G               ]       };
    key <AC06> {        [         h,    H               ]       };
    key <AC07> {        [         j,    J               ]       };
    key <AC08> {        [         k,    K               ]       };
    key <AC09> {        [         l,    L               ]       };
    key <AC10> {        [ semicolon,    colon           ]       };
    key <AC11> {        [ apostrophe,   quotedbl        ]       };

    key <AB01> {        [         z,    Z               ]       };
    key <AB02> {        [         x,    X               ]       };
    key <AB03> {        [         c,    C               ]       };
    key <AB04> {        [         v,    V               ]       };
    key <AB05> {        [         b,    B               ]       };
    key <AB06> {        [         n,    N               ]       };
    key <AB07> {        [         m,    M               ]       };
    key <AB08> {        [     comma,    less            ]       };
    key <AB09> {        [    period,    greater         ]       };
    key <AB10> {        [     slash,    question        ]       };

    key <BKSL> {        [ backslash,         bar        ]       };
    // End alphanumeric section

    //hjkl
    //AltGr + hjkl
    key <AC06> {        [         h, H, Left            ]       };
    key <AC07> {        [         j, J, Down            ]       };
    key <AC08> {        [         k, K, Up              ]       };
    key <AC09> {        [         l, L, Right           ]       };
    //Super_L -> Alt Gr
    key <LWIN> { [ ISO_Level3_Shift ] };


};

Espero que isso ajude alguém lá fora ...

Se alguém tiver uma solução melhor, entre em contato.

Edit: Testado no Fedora.


Eu mesmo fiz essa abordagem, mas não está funcionando para todos os aplicativos! xevdiz claramente Lefte funciona para a maioria das aplicações. Mas alguns programas reagem apenas às teclas de seta "reais", como editor de texto sublime e outros.
Tarrasch

11
Funciona como descrito no Redhat 6.2. Meus pulsos doloridos, obrigado!
21413 BuckFilledPlatypus

Obrigado basic6, ele funciona no Ubuntu após as etapas descritas abaixo. Há um problema no Ubuntu (testado no Ubuntu 14.04) que os arquivos .xkm não são recompilados e, portanto, alterações em / usr / share / X11 / xkb / symbols / * não têm efeito. Para melhorá-lo, remova todos os arquivos * .xkm de / var / lib / xkb e reinicie o sistema. Depois disso, os arquivos * .xkm serão recompilados. Para obter mais informações, consulte: ubuntuforums.org/showthread.php?t=1589744
MPtr:

3

Eu não tentei isso sozinho, mas parece que o xkb pode fazer o que você deseja http://en.wikipedia.org/wiki/X_keyboard_extension .

Eu tenho um pacote no Ubuntu chamado x11-xkb-utils que parece promissor :)


O xkb não pode funcionar com a tecla Super como um modificador. O xkb funciona apenas com (em ordem) Não modificado, Shift, AltGr, Shift-AltGr. Modificadores de nível superior também podem ser atribuídos (como no exemplo CapsLock de Bill Casarin), mas eles não vêm em um teclado padrão. Mapear Super para um modificador superior impede que funcione como Super (como no exemplo do basic6).
dotancohen

3

Nenhum sudo necessário, derivado daqui , foi modificado para fazê-lo funcionar também quando combinado com Alt.

crie um filew o seguinte conteúdo:

! remove Caps Lock
clear lock
! remove Lock = Caps_Lock
! remove Shift = Caps_Lock
keycode 66 = NoSymbol NoSymbol
keycode 66 = ISO_Level3_Shift

keysym h = h H NoSymbol NoSymbol Left Left
keysym j = j J NoSymbol NoSymbol Down Down
keysym k = k K NoSymbol NoSymbol Up Up
keysym l = l L NoSymbol NoSymbol Right Right

! some sugar
keysym o = o O NoSymbol NoSymbol BackSpace NoSymbol
keysym i = i I NoSymbol NoSymbol Delete NoSymbol`

invocar

xmodmap file

Ele mapeia AltGrpara em Capsvez de Super, então você pode definir

keycode 66 = Super_L

(ou o que xevvocê der ao bater Super)

A parte do açúcar fornece backspace e Del como uma tarefa especial para i e o, você pode omitir isso ou vê-lo como um bônus ou motivação para expandir / ajustá-lo por conta própria;)

PS: se experimentar, redefina o mapeamento "padrão" chamando

setxkbmap

Isso não funcionou para mim, mas me colocou no caminho certo. Isso funciona para mim: github.com/sblask/dotfiles/commit/…
Sebastian Blask

2

Por fim, parece que encontrei a solução que funciona com todos os modificadores (Ctrl +, Shift +, Ctrl + Shift +) e Sublime Text 2.

Toda a glória vai para esta configuração de gemas que eu encontrei recentemente http://www.spinics.net/lists/xorg/msg35931.html . Ele descreve as setas ijkl, mas pode ser facilmente modificado para a navegação hjkl. Você precisa atualizar o (s) arquivo (s) de layout de teclado / usr / share / X11 / xkb / symbols / * (pessoalmente, eu uso / usr / share / X11 / xkb / symbols / typo, que incluo no layout do teclado com o Xkb opção "misc: typo", para que funcione com qualquer layout de teclado). A configuração pressupõe que a chave modificadora envie ISO_Level3_Shift (existem várias maneiras de vincular Super ou Alt a ISO_Level3_Shift).

As principais definições devem ter a aparência (use NoSymbol se você estiver modificando ../symbols/typo):

key <AC07> {    
    type="MOD5_NAV",
    [NoSymbol, NoSymbol, Down, Down],   
    actions[Group1] = [NoAction(), NoAction(), RedirectKey(key=<DOWN>, clearmods=ISO_Level3_Shift)]
};

Você também precisa editar / usr / share / X11 / types / basic e declarar o tipo "MOD5_NAV":

type "MOD5_NAV" {
    modifiers = Shift+Mod5;
    map[None] = level1;
    map[Shift] = level2;
    map[Mod5] = level3;
    map[Mod5+Shift] = level3;
    level_name[Level1] = "Base";
    level_name[Level2] = "Caps";
    level_name[Level3] = "Arrows";
};

Quanto ao Sublime Text 2, a solução é mais complicada e imprudente. Como mencionado acima, o Sublime Text 2 lê códigos-chave diretamente do dispositivo e ignora alguns recursos do Xkb (e o truque do xkb com setas não tem efeito). Existe um projeto quase abandonado, mas ainda em funcionamento, Gizmo Daemon http://gizmod.sourceforge.net/ . Após algumas lutas e pesquisas, compilei com sucesso no meu Debian Wheezy. Então eu criei esse script gizmod e o coloquei em ~ / .gizmod / modules.d / 010-KeyboardViMode-SublimeText2.py http://pastebin.com/HNQgGEwD

PS No Linux, às vezes sinto falta do KeyboardRemap4MacBook. Essa grande tranquilidade do software OS X pode permitir essa navegação (e muitas outras coisas) com apenas algumas caixas de seleção.


1

Eu sou um usuário HHKB no Debian / Ubuntu e esta solução funciona para mim.

use Left Ctrlpara chave ativa.

$ vi ~/.Xmodmap
keycode 37 = ISO_Level3_Shift

Adicione este código // End alphanumeric sectionno bloco básico em / usr / share / X11 / xkb / symbols / us

//hjkl
//Ctrl + hjkl
key <AC06> {    [   h,  H,  Left    ]   };
key <AC07> {    [   j,  J,  Down    ]   };
key <AC08> {    [   k,  K,  Up      ]   };
key <AC09> {    [   l,  L,  Right   ]   };

Agora, você deve ser capaz de usar a esquerda, para baixo, para cima e tecla direita com Ctrl+ h, j, k, l.

A propósito, se você usou pentadactyl no Firefox, você pode adicionar este código em ~ / .pentadactylrc

map -modes=i,c <C-down> <down>
map -modes=i,c <C-up> <up>


1

Este funciona para mim no Arch. Ele remapeia Caps + hjkl para teclas de seta e Shift + Caps para Caps.

Coloque o seguinte em ~/.Xmodmap:

! Remap caps lock to special modifier, but still allow shift+caps to 
toggle caps lock
clear lock
clear mod5
add lock = Mode_switch
keycode 66 = Mode_switch Caps_Lock NoSymbol NoSymbol
keycode 43 = h H Left Left
keycode 44 = j J Down Down
keycode 45 = k K Up Up
keycode 46 = l L Right Right

Reinicie ou configure-o com xmodmap ~/.Xmodmap

Se você receber um erro como:

X Error of failed request:  BadValue (integer parameter out of range for operation)

Provavelmente significa que você precisa limpar algo diferente de mod5(o que estiver definido no momento Mode_switch). Verifique seus mapeamentos de modificadores atuais com xmodmap.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.