Encadernação Super + C Super + V para copiar e colar


23

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

Eu pensei 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 no nível do aplicativo?

Respostas:


18

Super vinculando a Ctrl

Que tal vincular sua Windows/Logo/Superchave esquerda a agir 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, como super_as_ctrl.xmodmapvocê pode testar o efeito executando

xmodmap super_as_ctrl.xmodmap

Para tornar a alteração permanente (reinserção / reinicialização sobrevivente), renomeie o arquivo para .Xmodmapna sua pasta pessoal.

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


Ajustando atalhos de copiar / colar para o seu programa de terminal

Tendo vinculado Supera Ctrlvocê agora pode usar Super-Cpara copiar quase todos os lugares. A única exceção comum é o seu programa de terminal. No entanto, você pode redefinir os atalhos lá.

Eu descobri que ainda gnome-terminaltem essa opção agora (eu não tinha até me acostumar Ctrl-Shift-C). Caso você o utilize, vá para Edit / Keyboard Shortcuts...o menu e atribua Ctrl-Ca copiar 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 do terminal, você pode usar Ctrl-Shift-Ccomo Ctrl-Cantes. O terminal não distingue aqui se Shift estiver pressionado ou não. E o atalho não é mais capturado para a cópia. Como alternativa, religue a terminação em outro atalho, como sugere MountainX em sua resposta.


XF86Copy etc. não funcionam

Sobre os principais símbolos para copiar e colar: Aparentemente, eles não têm efeito. Testei-o rapidamente atribuindo a ação de cópia ao Shift-ScrollLock (não era usada e queria testar com uma chave não modificadora):

xmodmap -e 'keycode 78 = Scroll_Lock XF86Copy Scroll_Lock'

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


3
Infelizmente, mesmo se eu vincular Super ao Ctrl, ainda terei que usar Ctrl / Super + Shift + C para copiar e colar dentro do terminal, o que é um incentivo primário. Agradecemos a confirmação de que as chaves XF86 não funcionam.
solo de

Qual programa de terminal você usa? Eu adicionei uma solução que funciona pelo menos com o gnome-terminal. E deve ser semelhante para os outros.
zpea

4
Vincular o controle ao Meta não é o mesmo que alterar o atalho para copiar / colar para Meta + c / v. Eu quero fazer atalhos MacOs iguais KboArd no Linux, assim que esta resposta não é excelente ...
Sonique

1
Shift + Ctrl + C ou o que é muito desajeitado, e apenas religação Super para Ctrl irá enviar o sinal de matar com Super + c para que não resolve realmente que muito
rien333

o primeiro passo é aproximadamente o que eu fiz para transformar super / comando em controle. Isso corrige a maioria das coisas - mas eu ainda gostaria que o cmd-c e o ctrl-c tivessem funções diferentes, mesmo que cmd signifique ctrl em outro lugar. Não tenho certeza se posso fazer isso com xmodmap e atalhos específicos do terminal.
precisa saber é o seguinte

9

Se você deseja vincular apenas algumas seqüências do formato Super + x, Super + c, Super + v a outras seqüências como Ctrl + x, Ctrl + c, Ctrl + v, por exemplo, para que (como o OP deseje) Seqüências específicas de superchave geralmente mapeiam para recortar e colar sem afetar outros usos da chave super 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 diferentes do teclado inicial; 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 no 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. Geralmente está em / usr / share / X11 / xkb, e não tenho muita certeza de como encontrá-lo se ele não estiver lá; você pode simplesmente procurar no seu sistema por diretórios denominados "xkb". De qualquer forma, depois de encontrá-lo, você pode modificar o sistema no local 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 sobrescrever 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 é seu diretório atual.

  2. Determine qual "tipo" de chave XKB são as 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 está intencionalmente incluída no padrão). Na minha primeira instalaçã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 no meu outro exemplo de configuração 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 "ALPHABETIC", enquanto no segundo exemplo são do tipo "FOUR_LEVEL". Dependendo da configuração do teclado, você pode achar que eles são de algum outro tipo. A seguir, o tipo será referido como $ TYPE $, que você deve substituir pela sequência ALPHABETIC real ou qualquer outra coisa nos comandos abaixo.

  3. Localize 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 eu escolhi é arbitrário, use o nome que você quiser, mas observe que você precisará consultar esse arquivo de forma consistente nas etapas posteriores. Na primeira instalação, esse 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 a tornem uma cláusula XKB adequada e altere o nome e a definição do tipo para adicionar mais um nível produzido pelo modificador correspondente a Super. Você deve verificar o que esse modificador está no seu sistema, é provável que o Mod4 seja usado abaixo. As modificações necessárias devem ser evidentes nas duas versões finais exemplificativas de tipos / pasta de corte, 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ímbolo de chave que foram produzidas pelo grep na segunda etapa em um segundo novo arquivo de símbolos / pasta de corte 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 manipular 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, extraí 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 no momento. Isso é fácil, é mostrado no resultado de setxkbmap -query. No meu caso, era "evdev".

  7. Copie a versão do sistema de rules / 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: é possível copiar todo o evdev ou apenas as partes que mencionam o modelo, o layout, a variante e as opções de teclado que você está realmente usando. Obviamente, se você estiver modificando os arquivos do sistema, não precisará copiar, apenas editar.

    Nesse 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 inicia com ! option = symbolse adiciona uma linha cutpaste:super = +cutpastea essa seção e também encontra a seção do arquivo de regras que inicia com ! option = typese uma linha cutpaste:super = +cutpastea 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 desse arquivo simplesmente corresponde 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 (s) que está usando. Você só precisa encontrar a seção deste arquivo que começa com ! 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 no lugar. Se você modificou os arquivos do sistema, agora poderá chamar sua nova opção com setxkbmap -option cutpaste:super. Por outro lado, se não, 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 o setxkbmap não (ou talvez não possa, pois, em última instância, o servidor pode estar executando em outra máquina) o informa. Portanto, você deve canalizar a saída do setxkbmap para o xkbcomp e também informar esse comando onde está o diretório $ XKBLOCAL. A linha de comando completa é, portanto setxkbmap -I$XKBLOCAL$ -option cutpaste:super -print | xkbcomp -I$XKBLOCAL - $DISPLAY.

Espero que isso ajude / interesse alguém, pois a boa documentação / referência definitiva do XKB é escassa. Uma referência muito útil foi http://madduck.net/docs/extending-xkb/ .


Excelente resposta. Isso funcionou para mim em 17.10
blockloop 14/04

Isso não funcionou para mim no Ubuntu 18.04. O resultado foi simplesmente que as teclas 'c', 'x' e 'v' não funcionam mais. Consegui fazê-los trabalhar novamente setxkbmap -option. Minha configuração local era quase idêntica ao exemplo FOUR_LEVEL, com exceção de alguns símbolos do Grupo2, Grupo3, que eu deixei de fora do arquivo de símbolos parciais, para que meu arquivo tivesse a mesma aparência dos exemplos.
precisa saber é o seguinte

2

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

No aplicativo do terminal X, defina as preferências de atalho. Eu fiz isso no Gnome e no KDE. No Konsole, por exemplo, vá para Menu> Configurações> Configurar Atalhos. Há 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. 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 associações de teclas stty (em .bashrc). Continuando o CTRL-C, por exemplo, cópia, digamos que você queira que a chave de interrupção seja agora CTRL-b (para "interrupção"). Isso faz com que:

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

Então origem .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 de eco de uma linha. Simples e cobre quase tudo que eu preciso.


0

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

xmodmap -e 'remove Mod4 = Super_L'

Obrigado, mas não faz o truque. Eu sei que o mapeamento funciona porque o xev relata eventos XF86.
solo de

Meu primeiro post (executando xmodmap -e 'remove Mod1 = Meta_L'e testando seus comandos depois) funcionou bem para mim.
URSS

1
@solo e sobre como trabalhar ou não, considere que nem todos os aplicativos ou ambientes de desktop os suportam. Para descobrir que realmente funciona ou não, use-os no Firefox, por exemplo. Ele suporta (ouve) ligações de teclas X.
URSS

0

Eu peguei um pouco do que Glen Whitney havia dito e consegui usar esse conhecimento para mapear o comportamento de piora da palavra ou manipulação de texto do macOS em um mapa de teclas personalizado.

Eu já resolvi o problema de copiar e colar Ctrl vs Super sem envolver essa solução específica, mas como eu disse, foi muito útil para outras coisas. Também evitei coisas como xmodmap, pois pretendo dar suporte total a Wayland em algum momento. O Kinto usa o xkb nativo e respeita o macOS esperado como o comportamento do terminal.

https://github.com/rbreaves/kinto

https://medium.com/@benreaves/kinto-a-mac-inspired-keyboard-mapping-for-linux-58f731817c0

Aqui também está um Gist, se você quiser apenas ver o que está no centro de tudo, ele não alternará seu mapa de teclas quando necessário. O Gist também não inclui arquivos de mapa de teclas xkb personalizados que configuram cursores no estilo macOS / manipulações de palavras que usam Cmd e as teclas de seta.

https://gist.github.com/rbreaves/f4cf8a991eaeea893999964f5e83eebb

conteúdo essencial

# permanent apple keyboard keyswap
echo "options hid_apple swap_opt_cmd=1" | sudo tee -a /etc/modprobe.d/hid_apple.conf
update-initramfs -u -k all

# Temporary & instant apple keyboard keyswap
echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd

# Windows and Mac keyboards - GUI (Physical Alt is Ctrl, Physical Super is Alt, Physical Ctrl is Super)
setxkbmap -option;setxkbmap -option altwin:ctrl_alt_win

# Windows and Mac keyboards - Terminal Apps (Physical Alt is Super, Physical Super is Alt, Physical Ctrl is Ctrl)
setxkbmap -option;setxkbmap -option altwin:swap_alt_win

# If the hid_apple driver is not loaded for Apple keyboards, which can be found out
# by the lsmod command then the above setxkbmap commands will not work
# Use the following commands for Apple style keyboards without an hid_apple driver
#
# Note: this could also apply to hid_apple driver as well 
# if this option is set to 0 inside swap_opt_cmd
#
lsmod | grep hid_apple

# Apple keyboard without hid_apple - GUI
setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl,ctrl:swap_rwin_rctl

# Apple keyboard without hid_apple - Terminal
setxkbmap -option;setxkbmap -option altwin:alt_super_win

#
# If you want a systemd service and bash script to help toggle between
# GUI and Terminal applications then look at project Kinto.
# https://github.com/rbreaves/kinto
#
# Note: The above may not work for Chromebooks running Linux, please look
# at project Kinto for that.
#
# If anyone would like to contribute to the project then please do!
#
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.