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.h
e xev
mostram 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/Super
tecla esquerda para atuar como outra Ctrl
chave?
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.xmodmap
você 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 .Xmodmap
sua 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
, Ctrl
agora você pode Super-C
copiar 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-terminal
agora tem essa opção (não tinha até me acostumar Ctrl-Shift-C
mesmo). Caso você utilize esse, acesse Edit / Keyboard Shortcuts...
no menu e atribua Ctrl-C
copiar e Ctrl-V
colar. Deve ser semelhante para konsole
etc.
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-C
como usou Ctrl-C
antes. 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
.
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.
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.
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údotype "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"; };
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"'; }; };
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.
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".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 = symbols
e adiciona uma linhacutpaste:super = +cutpaste
a essa seção, e também encontra a seção do arquivo de regras que começa com! option = types
e uma linhacutpaste:super = +cutpaste
para essa seção.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
! option
e adicionar uma linha como esta:cutpaste:super Add super equivalents of cut and paste operations
a essa seção.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 é, portantosetxkbmap -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'