Enlace Super + C Super + V para copiar y pegar

23

Durante algún tiempo, he estado interesado en vincular la tecla de Windows (Super_L) en mi teclado para copiar y pegar sin otra razón que la conveniencia y la coherencia entre mi escritorio y mi MacBook.

Pensé que estaba cerca después de leer sobre xmodmap y ejecutar lo siguiente:

$ # 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"

Desafortunadamente, XF86Copy y XF86Paste no parecen funcionar en absoluto. Se enumeran en /usr/include/X11/XF86keysym.hy xevmuestra que la secuencia de teclas está siendo interpretada por X como XF86Paste y XF86Copy, ¿funcionan realmente estos símbolos? ¿Tienen que tener soporte a nivel de aplicación?

solo
fuente

Respuestas:

18

Enlace Super a Ctrl

¿Qué hay de vincular su Windows/Logo/Supertecla izquierda para actuar como otra Ctrltecla?

Puede lograr eso con los siguientes comandos xmodmap:

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

Suponiendo que guardó las líneas anteriores ya super_as_ctrl.xmodmapque puede probar el efecto ejecutando

xmodmap super_as_ctrl.xmodmap

Para que el cambio sea permanente (reinicio / reinicio supervivientes) cambie el nombre del archivo a .Xmodmapsu carpeta de inicio.

(Lo anterior se probó en el sistema en vivo Ubuntu 11.10, pero debería ser el mismo para otras distribuciones de Linux)


Ajuste de accesos directos Copiar / Pegar para su programa de terminal

Habiendo vinculado Supera Ctrlusted ahora puede usar Super-Cpara copiar casi en todas partes. La única excepción común es su programa de terminal. Sin embargo, puede redefinir los accesos directos allí.

Descubrí que incluso gnome-terminaltiene esta opción por ahora (no la tuve hasta que me acostumbré de Ctrl-Shift-Ctodos modos). En caso de que use ese, vaya al Edit / Keyboard Shortcuts...menú y asigne Ctrl-Ccopiar y Ctrl-Vpegar. Debería ser similar para konsoleetc.

Y no se preocupe, no perderá la capacidad de terminar un programa utilizando un acceso directo. Después de volver a enlazar el acceso directo de copia para el terminal, puede usarlo Ctrl-Shift-Ccomo solía Ctrl-Chacerlo antes. El terminal no distingue aquí si se presiona Shift o no. Y el atajo ya no se detecta para la copia. Alternativamente, vuelva a vincular la terminación a otro acceso directo, como MountainX sugiere en su respuesta.


XF86Copia, etc.no funciona

En cuanto a los símbolos clave para copiar y pegar: aparentemente no tienen ningún efecto. Lo probé rápidamente asignando la acción de copia a Shift-ScrollLock (no estaba en uso y quería probar con una tecla sin modificador):

xmodmap -e 'keycode 78 = Scroll_Lock XF86Copy Scroll_Lock'

Presionarlo no tuvo ningún efecto, ni con XF86AudioMute. Sin embargo, funcionó al asignar la letra 'a'. Así que supongo que hay un problema específico con estos símbolos de teclas especiales XF86.

zpea
fuente
3
Desafortunadamente, incluso si enlazo Super a Ctrl, aún tendré que usar Ctrl / Super + Shift + C para copiar y pegar dentro del terminal, lo cual es un incentivo principal. Gracias confirmando que las teclas XF86 no funcionan.
solo
¿Qué programa de terminal usas? Agregué una solución que funciona con gnome-terminal al menos. Y debería ser similar para otros.
zpea
44
Control de enlace a Meta no es lo mismo que cambiar el acceso directo para copiar / pegar en Meta + c / v. Quiero hacer que MacOs sean accesos directos de kboard en Linux, por lo que esta respuesta no es excelente ...
Sonique
1
Shift + ctrl + c o lo que sea demasiado torpe, y solo volver a vincular Super a Ctrl enviará la señal de muerte con Super + c para que eso realmente no resuelva demasiado
rien333
El primer paso es aproximadamente lo que hice para convertir Super / Command en control. Eso soluciona la mayoría de las cosas, pero todavía me gustaría que cmd-c y ctrl-c tengan diferentes funciones, incluso si cmd significa ctrl en otro lugar. No estoy seguro si puedo hacer esto con xmodmap y accesos directos específicos de terminal.
tedder42
9

Si desea vincular solo algunas secuencias de la forma Super + x, Super + c, Super + v a otras secuencias como Ctrl + x, Ctrl + c, Ctrl + v, por ejemplo, para que (como el OP lo desee) estas En particular, las secuencias de Superclave generalmente se asignarán para cortar y pegar sin afectar ningún otro uso de la Superclave en su sistema, es posible usando solo la extensión XKB. El siguiente procedimiento describe los pasos y ofrece dos ejemplos diferentes de los detalles para dos configuraciones de teclado de inicio diferentes; con suerte eso proporcionará suficiente información para adaptarse a su sistema. Se supone que se siente cómodo creando y editando archivos en su sistema, incluidos los que se encuentran en ubicaciones del sistema como /usr/share/X11/xkb.

  1. Decida dónde desea que resida su árbol de configuración XKB. Primero encuentre el sistema uno. Normalmente está en / usr / share / X11 / xkb, y no estoy muy seguro de cómo encontrarlo si no está allí; simplemente puede buscar en su sistema directorios llamados "xkb". De todos modos, una vez que lo haya encontrado, puede modificar el sistema en su lugar o puede usar cualquier directorio de su elección. La ventaja de utilizar el directorio del sistema es que puede invocar sus cambios con mucha más facilidad, pero el inconveniente es que las futuras actualizaciones del sistema podrían sobrescribir sus cambios (se le ha advertido). En cualquier caso, todos los nombres de archivo mencionados a continuación son relativos a este directorio, al que me referiré cuando sea necesario como $ XKBLOCAL $, y todos los comandos asumen que ese es su directorio actual.

  2. Determine qué "tipo" de clave XKB son las claves x, c, v actuales. La forma más fácil de hacerlo es a través del comando xkbcomp -a $DISPLAY - | grep -C 6 c,(tenga en cuenta que la coma se incluye intencionalmente en el patrón). En mi primer ejemplo de configuración, esto produce:

    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> {
    

    mientras que en mi otra configuración de ejemplo esto produce

    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> {
    

    El resultado es que en el primer ejemplo, las claves relevantes son del tipo "ALPHABETIC", mientras que en el segundo ejemplo son del tipo "FOUR_LEVEL". Dependiendo de la configuración de su teclado, puede encontrar que son de algún otro tipo. En lo que sigue, el tipo se denominará $ TYPE $, que debe reemplazar con la cadena ALPHABETIC real o lo que sea en los comandos a continuación.

  3. Encuentre la definición de $ TYPE $ y cópiela en un nuevo archivo en el directorio $ XKBLOCAL $ / types. Aquí hay un comando que hace precisamente eso: xkbcomp -a $DISPLAY - | grep -z -o 'type "$TYPE$" {[^}]*};' > types/cutpaste. El nombre del archivo "cutpaste" que elegí es arbitrario, use el nombre que desee, pero tenga en cuenta que tendrá que referirse a este archivo constantemente en los pasos posteriores. En la primera configuración, este archivo obtiene el contenido

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

    y en el otro ejemplo obtiene los contenidos

    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 los tipos de archivo / pasta de corte para hacer dos cosas: agregue un preámbulo y postamble que lo convierta en una cláusula XKB adecuada, y modifique el nombre del tipo y la definición del tipo para agregar un nivel más producido por el modificador correspondiente a Super. Debe verificar cuál es ese modificador en su sistema, es probable que sea Mod4 como se usa a continuación. Las modificaciones necesarias deben ser evidentes a partir de los dos ejemplos de versiones finales 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";
        };
    };
    

    y

    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 las definiciones de símbolos de clave que fueron generadas por grep en el segundo paso en un segundo nuevo archivo de símbolos / corte, y agregue preámbulos y postamble similares, y modifique las definiciones para usar los nuevos tipos y agregue acciones a la definición para manejar la clave deseada producido por las versiones Super. Los resultados de esto en nuestros dos ejemplos son:

    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)]
        };
    };
    

    y

    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)]
        };
    };
    

    Tenga en cuenta que en el segundo ejemplo también eliminé algunos de los espacios en blanco (no significativos) para mantener la longitud de la línea bajo un poco de control.

  6. Encuentre el nombre del conjunto de reglas que XKB está usando actualmente. Eso es fácil, se muestra en el resultado de setxkbmap -query. En mi caso, fue "evdev".

  7. Copie la versión del sistema de rules / evdev (o cualquiera que sea el nombre de su conjunto de reglas) en $ XKBLOCAL $ / rules / evdev y agregue reglas que apunten a las opciones que hemos creado. Aquí tiene dos opciones: puede copiar todo evdev o solo las partes que mencionan el modelo de teclado, el diseño, la variante y las opciones que realmente está utilizando. Por supuesto, si está modificando los archivos del sistema en su lugar, no necesita copiar, solo editar.

    En este caso, lo que se agrega es idéntico independientemente de la configuración inicial del teclado, por lo que solo hay un ejemplo. Encuentra la sección del archivo de reglas que comienza con ! option = symbolsy agrega una línea cutpaste:super = +cutpastea esa sección, y también encuentra la sección del archivo de reglas que comienza con ! option = typesy una línea cutpaste:super = +cutpastea esa sección también.

  8. Copie la versión del sistema de evdev.lst y agregue una línea para su nueva opción. Tenga en cuenta que el nombre de este archivo simplemente corresponde al nombre del archivo de reglas con .lst adjunto. Como en el paso anterior, puede copiar todo el archivo o solo la parte a la que hace referencia el modelo, el diseño, la variante y las opciones que está utilizando. Solo necesita encontrar la sección de este archivo que comienza con ! optiony agregar una línea como esta: cutpaste:super Add super equivalents of cut and paste operationsa esa sección.

  9. OK, ahora todos los archivos de configuración están en su lugar. Si modificó los archivos del sistema, ahora puede invocar su nueva opción con setxkbmap -option cutpaste:super. Por otro lado, si no lo hizo, debe informar a setxkbmap dónde está su directorio $ XKBLOCAL $. Lo que es peor, el servidor tampoco sabe dónde está ese directorio, y setxkbmap no lo sabe (o tal vez no puede, ya que en última instancia el servidor podría estar ejecutándose en otra máquina). Por lo tanto, debe canalizar la salida de setxkbmap a xkbcomp, y también decirle a ese comando dónde está su directorio $ XKBLOCAL. La línea de comando completa es por lo tanto setxkbmap -I$XKBLOCAL$ -option cutpaste:super -print | xkbcomp -I$XKBLOCAL - $DISPLAY.

Esperemos que esto sea de ayuda / interés para alguien, ya que la buena documentación / referencia definitiva de XKB es escasa. Una referencia muy útil fue http://madduck.net/docs/extending-xkb/ .

Glen Whitney
fuente
Excelente respuesta Esto funcionó para mí en 17.10
blockloop
Esto no funcionó para mí en Ubuntu 18.04. El resultado fue simplemente que las teclas 'c', 'x' y 'v' ya no funcionan. Pude hacer que volvieran a funcionar setxkbmap -option. Mi configuración local era casi idéntica al ejemplo FOUR_LEVEL con la excepción de algunos símbolos Group2, Group3 que dejé fuera del archivo de símbolos parciales para que mi archivo tuviera el mismo aspecto que los ejemplos.
JinnKo
2

Esto es lo que hago. No es la solución definitiva, pero intenté lograr la solución definitiva y no pude llegar después de mucho esfuerzo. Así que me decidí por algo que es simple y que funciona para más del 90% de lo que necesito. Puedo implementarlo en cualquier computadora a la que vaya (o en cualquier instalación nueva de Linux) en cuestión de minutos. Es muy simple.

En la aplicación de terminal X, configure las preferencias de acceso directo. He hecho esto tanto en Gnome como en KDE. En Konsole, por ejemplo, vaya a Menú> Configuración> Configurar accesos directos. Hay un menú similar en el terminal Gnome X. Simplemente seleccione el acceso directo (por ejemplo, "copiar") e ingrese la secuencia de teclas deseada.

En caso de que los accesos directos de copiar y pegar del terminal entren en conflicto con los comandos del terminal, también hay una solución fácil para eso. Por ejemplo, ¿qué pasa si alguien quiere usar CTRL-C para la copia (por lo que el terminal X se ajusta al estándar CUA)?

En ese caso, puede cambiar fácilmente las combinaciones de teclas stty (en .bashrc). Continuando con CTRL-C por ejemplo de copia, digamos que desea que la tecla de interrupción ahora sea CTRL-b (para "interrupción"). Esto logra que:

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

Entonces fuente .bashrc.

La solución completa es tan simple como usar la configuración de los terminales X para cambiar los accesos directos y luego, opcionalmente, resolver conflictos con stty con un comando de eco de una línea. Muy simple y cubre casi todo lo que necesito.

MountainX para Monica Cellio
fuente
0

Probablemente la clave de Windows es la clave modificadora. ejecuta esto y vuelve a intentarlo:

xmodmap -e 'remove Mod4 = Super_L'
la urss
fuente
Gracias, pero no funciona. Sé que el mapeo funciona porque xev informa eventos XF86.
solo
Mi primera publicación (ejecutar xmodmap -e 'remove Mod1 = Meta_L'y probar sus comandos después) funcionó bien para mí.
URSS
1
@solo y sobre trabajar o no, tenga en cuenta que no todos los entornos de escritorio o aplicaciones los admiten. Para descubrir que realmente funciona o no, úsalos en Firefox, por ejemplo. Admite (escucha) las combinaciones de teclas X.
URSS
0

Tomé algo de lo que Glen Whitney había dicho y logré usar ese conocimiento para mapear el comportamiento de manipulación de texto o palabras peores de macOS en un mapa de teclas personalizado.

Ya resolví el problema de copiar y pegar Ctrl vs Super sin involucrar esa solución específica, pero como dije, fue muy útil para otras cosas. También he evitado cosas como xmodmap, ya que tengo el objetivo de admitir completamente Wayland en algún momento. Kinto usa el xkb nativo y respeta el macOS esperado como el comportamiento del terminal.

https://github.com/rbreaves/kinto

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

Aquí también hay un Gist, si solo quieres ver lo que está en el centro de todo, no alternará tu mapa de teclas cuando sea necesario. El Gist tampoco incluye archivos de mapa de teclas xkb personalizados que configuran cursores de estilo macOS / manipulaciones de palabras que usan Cmd y las teclas de flecha.

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

contenido esencial

# 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!
#
R Ben R
fuente