Vinculando Super a Ctrl

Vinculando Super a Ctrl

Há algum tempo estou interessado em vincular a tecla Windows (Super_L) do meu teclado para copiar e colar por nenhum outro motivo além da conveniência e consistência entre minha área de trabalho e meu MacBook.

Achei que estava perto depois de ler sobre o xmodmap e executar o seguinte:

$ # re-map Super_L to Mode_switch, the 3rd col in keymap table `xmodmap -pke`
$ xmodmap -e "keycode  133 = Mode_switch"

$ # map Mode_switch+c to copy
$ xmodmap -e "keycode  54 = c C XF86_Copy C"

$ # map Mode_switch+v to paste
$ xmodmap -e "keycode  55 = v V XF86_Paste V"

Infelizmente, XF86Copy e XF86Paste parecem não funcionar. Eles estão listados /usr/include/X11/XF86keysym.he xevmostram que a sequência de teclas está sendo interpretada por X como XF86Paste e XF86Copy. Esses símbolos realmente funcionam? Eles precisam ter suporte em nível de aplicativo?

Responder1

Vinculando Super a Ctrl

Que tal vincular sua Windows/Logo/Supertecla esquerda para atuar como outra Ctrlchave?

Você pode conseguir isso com os seguintes comandos xmodmap:

remove mod4 = Super_L
keysym Super_L = Control_L
add Control = Control_L

Supondo que você salvou as linhas acima, super_as_ctrl.xmodmapvocê pode testar o efeito executando

xmodmap super_as_ctrl.xmodmap

Para tornar a alteração permanente (sobrevivendo ao novo login/reinicialização), renomeie o arquivo para .Xmodmapsua pasta pessoal.

(O acima foi testado no sistema Ubuntu 11.10 live, mas deve ser o mesmo para outras distribuições Linux)


Ajustando atalhos de copiar/colar para seu programa de terminal

Depois de vinculado Super, Ctrlagora você pode Super-Ccopiar em quase todos os lugares. A única exceção comum é o seu programa de terminal. No entanto, você pode redefinir os atalhos lá.

Descobri que até gnome-terminalagora tem essa opção (não tinha até me acostumar Ctrl-Shift-Cmesmo). Caso você utilize esse, acesse Edit / Keyboard Shortcuts...no menu e atribua Ctrl-Ccopiar e Ctrl-Vcolar. Deve ser semelhante para konsoleetc.

E não se preocupe, você não perderá a capacidade de encerrar um programa usando um atalho. Depois de religar o atalho de cópia para o terminal, você pode simplesmente usar Ctrl-Shift-Ccomo usou Ctrl-Cantes. O terminal não distingue aqui se Shift está pressionado ou não. E o atalho não é mais capturado para a cópia. Como alternativa, religue a terminação para outro atalho, como sugere MountainX em sua resposta.


XF86Copy etc. não funciona

Quanto aos símbolos principais para copiar e colar: Aparentemente eles não têm efeito. Testei-o rapidamente atribuindo a ação de cópia a Shift-ScrollLock (não foi utilizado e eu queria testar com uma tecla não modificadora):

xmodmap -e 'keycode 78 = Scroll_Lock XF86Copy Scroll_Lock'

Pressioná-lo não teve efeito, nem com o XF86AudioMute. No entanto, funcionou ao atribuir a letra 'a'. Portanto, acho que há um problema específico com esses símbolos de teclas especiais do XF86.

Responder2

Se você deseja vincular apenas algumas sequências do formato Super+x, Super+c, Super+v a outras sequências como Ctrl+x, Ctrl+c, Ctrl+v, por exemplo, para que (conforme o OP desejado) estes sequências específicas de Super-chave geralmente serão mapeadas para recortar e colar sem afetar quaisquer outros usos da Super-chave em seu sistema, é possível usar apenas a extensão XKB. O procedimento abaixo descreve as etapas e fornece dois exemplos diferentes de detalhes para duas configurações iniciais de teclado diferentes; espero que isso forneça informações suficientes para se adaptar ao seu sistema. Ele pressupõe que você esteja confortável com a criação e edição de arquivos em seu sistema, incluindo aqueles em locais do sistema como /usr/share/X11/xkb.

  1. Decida onde você deseja que sua árvore de configuração XKB resida. Primeiro encontre o sistema. Normalmente está em /usr/share/X11/xkb e não tenho certeza de como encontrá-lo se não estiver lá; você pode simplesmente pesquisar em seu sistema diretórios chamados "xkb". De qualquer forma, depois de encontrá-lo, você pode modificar o sistema existente ou usar qualquer diretório de sua escolha. A vantagem de usar o diretório do sistema é que você pode invocar suas alterações com muito mais facilidade, mas a desvantagem é que futuras atualizações do sistema podem substituir suas alterações (você foi avisado). De qualquer forma, todos os nomes de arquivos mencionados a seguir são relativos a este diretório, ao qual me referirei quando necessário como $XKBLOCAL$, e todos os comandos assumem que esse é o seu diretório atual.

  2. Determine qual é o "tipo" de chave XKB das chaves x, c, v atuais. A maneira mais fácil de fazer isso é através do comando xkbcomp -a $DISPLAY - | grep -C 6 c,(observe que a vírgula foi incluída intencionalmente no padrão). Na minha primeira configuração de exemplo, isso produz:

    key <AB02> {
        type= "ALPHABETIC",
        symbols[Group1]= [               x,               X ]
    };
    key <AB03> {
        type= "ALPHABETIC",
        symbols[Group1]= [               c,               C ]
    };
    key <AB04> {
        type= "ALPHABETIC",
        symbols[Group1]= [               v,               V ]
    };
    key <AB05> {
    

    enquanto na minha outra configuração de exemplo isso produz

    key <AB02> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               x,               X, approxeq,     dead_ogonek ]
    };
    key <AB03> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               c,               C, ccedilla,        Ccedilla ]
    };
    key <AB04> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               v,               V, squareroot,           U25CA ]
    };
    key <AB05> {
    

    O resultado é que no primeiro exemplo as chaves relevantes são do tipo "ALFABÉTICA" enquanto no segundo exemplo são do tipo "FOUR_LEVEL". Dependendo da configuração do teclado, você pode descobrir que eles são de algum outro tipo. A seguir, o tipo será referido como $TYPE$, que você deve substituir pela string ALPHABETIC real ou qualquer outra nos comandos abaixo.

  3. Encontre a definição de $TYPE$ e copie-a para um novo arquivo no diretório $XKBLOCAL$/types. Aqui está um comando que faz exatamente isso: xkbcomp -a $DISPLAY - | grep -z -o 'type "$TYPE$" {[^}]*};' > types/cutpaste. O nome do arquivo "cutpaste" que escolhi é arbitrário, use o nome que desejar, mas observe que você terá que consultar esse arquivo de forma consistente nas etapas posteriores. Na primeira configuração, este arquivo obtém o conteúdo

    type "ALPHABETIC" {
        modifiers= Shift+Lock;
        map[Shift]= Level2;
        map[Lock]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "Caps";
    };
    

    e no outro exemplo obtém o conteúdo

    type "FOUR_LEVEL" {
        modifiers= Shift+LevelThree;
        map[Shift]= Level2;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
    };
    
  4. Edite os tipos de arquivo/cutpaste para fazer duas coisas: adicione um preâmbulo e um postâmbulo que o torne uma cláusula XKB adequada e altere o nome do tipo e a definição do tipo para adicionar mais um nível produzido pelo modificador correspondente a Super. Você deve verificar qual é esse modificador em seu sistema, provavelmente é Mod4 conforme usado abaixo. As modificações necessárias devem ficar evidentes nos dois exemplos de versões finais de types/cutpaste, a saber:

    default partial xkb_types "addsuper" {
        type "ALPHABETIC_SUPER" {
            modifiers= Shift+Lock+Mod4;
            map[Shift]= Level2;
            map[Lock]= Level2;
            map[Mod4]= Level3;
            map[Shift+Mod4]= Level3;
            map[Lock+Mod4]= Level3;
            level_name[Level1]= "Base";
            level_name[Level2]= "Caps";
            level_name[Level3]= "With Super";
        };
    };
    

    e

    default partial xkb_types "addsuper" {
        type "FOUR_LEVEL_SUPER" {
            modifiers= Shift+LevelThree+Mod4;
            map[Shift]= Level2;
            map[LevelThree]= Level3;
            map[Shift+LevelThree]= Level4;
            map[Mod4]= Level5;
            map[Shift+Mod4] = Level5;
            map[LevelThree+Mod4] = Level5;
            map[Shift+LevelThree+Mod4] = Level5;
            level_name[Level1]= "Base";
            level_name[Level2]= "Shift";
            level_name[Level3]= "Alt Base";
            level_name[Level4]= "Shift Alt";
            level_name[Level5]= "With Super"';
       };
    };
    
  5. Copie as definições de símbolos-chave que foram geradas pelo grep na segunda etapa em um segundo novo arquivo de símbolos/cortar e adicione preâmbulo e postâmbulo semelhantes e modifique as definições para usar os novos tipos e adicione ações à definição para lidar com a chave desejada produzido pelas versões Super. Os resultados disso em nossos dois exemplos são:

    default partial xkb_symbols "superversions" {
        replace key <AB02> {
            type[Group1]= "ALPHABETIC_SUPER",
            symbols[Group1]= [               x,               X, NoSymbol ],
            actions[Group1]= [      NoAction(),      NoAction(), RedirectKey(key=<LatX>,mods=Control,clearmods=Super)]
        };
        replace key <AB03> {
            type[Group1]= "ALPHABETIC_SUPER",
            symbols[Group1]= [               c,               C, NoSymbol ],
            actions[Group1]= [      NoAction(),      NoAction(), RedirectKey(key=<LatC>,mods=Control,clearmods=Super)]
        };
        replace key <AB04> {
            type[Group1]= "ALPHABETIC_SUPER",
            symbols[Group1]= [               v,               V, NoSymbol ],
            actions[Group1]= [      NoAction(),      NoAction(), RedirectKey(key=<LatV>,mods=Control,clearmods=Super)]
        };
    };
    

    e

    default partial xkb_symbols "superversions" {
        replace key <AB02> { 
            type[Group1]= "FOUR_LEVEL_SUPER",
            symbols[Group1]= [x,X,approxeq,dead_ogonek,NoSymbol],
            actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatX>,mods=Control,clearmods=Super)]
        };
        replace key <AB03> { 
            type[Group1]= "FOUR_LEVEL_SUPER",
            symbols[Group1]= [c,C,ccedilla,Ccedilla,NoSymbol],
            actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatC>,mods=Control,clearmods=Super)]
        };
        replace key <AB04> { 
            type[Group1]= "FOUR_LEVEL_SUPER",
            symbols[Group1]= [v,V,squareroot,U25CA,NoSymbol],
            actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatV>,mods=Control,clearmods=Super)]
        };
    };
    

    Observe que no segundo exemplo eu também espremi alguns espaços em branco (não significativos) para manter o comprimento da linha sob um pouco de controle.

  6. Encontre o nome do conjunto de regras que o XKB está usando atualmente. Isso é fácil, é mostrado no resultado de setxkbmap -query. No meu caso, foi "evdev".

  7. Copie a versão do sistema de regras/evdev (ou qualquer que seja o nome do seu conjunto de regras) para $XKBLOCAL$/rules/evdev e adicione regras apontando para as opções que criamos. Você tem duas opções aqui: você pode copiar todo o evdev ou apenas as partes que mencionam o modelo de teclado, layout, variante e opção(ões) que você está realmente usando. Claro, se você estiver modificando os arquivos do sistema, não precisará fazer nenhuma cópia, apenas editar.

    Neste caso, o que é adicionado é idêntico, independentemente da configuração inicial do teclado, portanto há apenas um exemplo. Você encontra a seção do arquivo de regras que começa com ! option = symbolse adiciona uma linha cutpaste:super = +cutpastea essa seção, e também encontra a seção do arquivo de regras que começa com ! option = typese uma linha cutpaste:super = +cutpastepara essa seção.

  8. Copie a versão do sistema evdev.lst e adicione uma linha para sua nova opção. Observe que o nome deste arquivo corresponde simplesmente ao nome do arquivo de regras com .lst anexado. Como na etapa anterior, você pode copiar o arquivo inteiro ou apenas a parte referenciada pelo modelo, layout, variante e opção(ões) que você está usando. Você só precisa encontrar a seção deste arquivo que começa ! optione adicionar uma linha como esta: cutpaste:super Add super equivalents of cut and paste operationsa essa seção.

  9. OK, agora todos os arquivos de configuração estão em seus lugares. Se você modificou os arquivos do sistema, agora você pode invocar sua nova opção com setxkbmap -option cutpaste:super. Por outro lado, se não o fez, você deve informar ao setxkbmap onde está o seu diretório $XKBLOCAL$. O que é pior, o servidor também não sabe onde está esse diretório, e setxkbmap não informa (ou talvez não possa, já que em última análise o servidor pode estar rodando em outra máquina). Portanto, você deve canalizar a saída de setxkbmap para xkbcomp e também informar ao comando onde está seu diretório $XKBLOCAL. A linha de comando completa é, portanto setxkbmap -I$XKBLOCAL$ -option cutpaste:super -print | xkbcomp -I$XKBLOCAL - $DISPLAY, .

Esperamos que isso seja de ajuda/interesse para alguém, já que uma boa documentação/referência definitiva do XKB é escassa. Uma referência muito útil foihttp://madduck.net/docs/extending-xkb/.

Responder3

Aqui está o que eu faço. Não é a solução definitiva, mas tentei chegar à solução definitiva e não consegui chegar lá depois de muito esforço. Então optei por algo que seja simples e que funcione para mais de 90% do que preciso. Posso implementá-lo em qualquer computador que eu usar (ou em qualquer nova instalação do Linux) em questão de minutos. É muito simples.

No aplicativo terminal X, defina as preferências de atalho. Eu fiz isso no Gnome e no KDE. No Konsole, por exemplo, vá em Menu > Configurações > Configurar Atalhos. Existe um menu semelhante no terminal Gnome X. Basta selecionar o atalho (por exemplo, “copiar”) e inserir a sequência de teclas desejada.

Caso os atalhos de copiar e colar do terminal entrem em conflito com os comandos do terminal, também há uma solução fácil para isso. Por exemplo, e se alguém quiser usar CTRL-C para cópia (para que o terminal X esteja em conformidade com o padrão CUA)?

Nesse caso, você pode alterar facilmente as combinações de teclas stty (em .bashrc). Continuando o exemplo CTRL-C para cópia, digamos que você deseja que a chave de interrupção agora seja CTRL-b (para "quebra"). Isso faz com que:

echo "stty intr \^b" >> ~/.bashrc 

Em seguida, fonte .bashrc.

Toda a solução é tão simples quanto usar as configurações dos terminais X para alterar os atalhos e, opcionalmente, resolver conflitos com stty com um comando echo de uma linha. Muito simples e cobre quase tudo que preciso.

Responder4

Provavelmente a chave do Windows é uma tecla modificadora. execute isso e tente novamente:

xmodmap -e 'remove Mod4 = Super_L'

informação relacionada