Vinculación de Super a Ctrl

Vinculación de Super a Ctrl

Durante algún tiempo he estado interesado en vincular la tecla de Windows (Super_L) de mi teclado para copiar y pegar únicamente por conveniencia y 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 /usr/include/X11/XF86keysym.hy xevmuestran que X interpreta la secuencia de teclas como XF86Paste y XF86Copy. ¿Estos símbolos realmente funcionan? ¿Tienen que tener soporte a nivel de aplicación?

Respuesta1

Vinculación de Super a Ctrl

¿Qué tal si vinculamos la tecla izquierda Windows/Logo/Superpara que actúe como otra Ctrltecla?

Puede lograrlo 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, super_as_ctrl.xmodmappuede probar el efecto ejecutando

xmodmap super_as_ctrl.xmodmap

Para que el cambio sea permanente (sobreviviendo al inicio de sesión/reinicio), 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)


Ajustar los accesos directos de Copiar/Pegar para su programa de terminal

Una vez vinculado Super, Ctrlahora puede utilizarlo Super-Cpara copiar en casi todas partes. La única excepción común es su programa terminal. Sin embargo, puedes redefinir los atajos allí.

Descubrí que incluso gnome-terminalahora tiene esta opción (de todos modos, no la tenía hasta que me acostumbré Ctrl-Shift-C). En caso de que uses ese, ve Edit / Keyboard Shortcuts...al menú y asigna Ctrl-Cpara copiar y Ctrl-Vpegar. Debería ser similar para konsoleetc.

Y no te preocupes, no perderás la posibilidad de finalizar un programa mediante un acceso directo. Después de volver a vincular el acceso directo de copia para la terminal, puede usarlo Ctrl-Shift-Ccomo lo usó Ctrl-Cantes. El terminal aquí no distingue si se pulsa Shift o no. Y el atajo ya no se captura para la copia. Alternativamente, vuelva a vincular la terminación a otro acceso directo, como sugiere MountainX en su respuesta.


XF86Copiar etc. no funcionan

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 copiar a Shift-ScrollLock (no se usó y quería probar con una tecla no modificadora):

xmodmap -e 'keycode 78 = Scroll_Lock XF86Copy Scroll_Lock'

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

Respuesta2

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 desee el OP) estas Las secuencias de Superclave particulares generalmente se asignarán para cortar y pegar sin afectar ningún otro uso de la Superclave en su sistema; es posible usar solo la extensión XKB. El procedimiento siguiente describe los pasos y ofrece dos ejemplos diferentes de los detalles de dos configuraciones de teclado iniciales 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 busque el del sistema. 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 existente o puede usar cualquier directorio de su elección. La ventaja de utilizar el directorio del sistema es que puede invocar sus cambios mucho más fácilmente, pero el inconveniente es que futuras actualizaciones del sistema podrían sobrescribir sus cambios (se le ha advertido). En cualquier caso, todos los nombres de archivos 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 sencilla de hacerlo es mediante el 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 otro ejemplo de configuración 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 "ALFABETIC", mientras que en el segundo ejemplo son del tipo "FOUR_LEVEL". Dependiendo de la configuración de su teclado, es posible que descubra que son de algún tipo completamente diferente. En lo que sigue, nos referiremos al tipo como $TYPE$, que deberá reemplazar con la cadena real ALPHABETIC o lo que sea en los comandos siguientes.

  3. Busque 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 consultar este archivo de manera constante en 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 el contenido

    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 archivos/pegue para hacer dos cosas: agregue un preámbulo y un postámbulo que lo conviertan 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; probablemente sea Mod4 como se usa a continuación. Las modificaciones necesarias deberían ser evidentes a partir de los dos ejemplos de versiones finales de tipos/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";
        };
    };
    

    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 archivo nuevo de símbolos/pegar, y agregue un preámbulo y un postámbulo 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. Busque el nombre del conjunto de reglas que XKB está utilizando 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 reglas/evdev (o cualquiera que sea el nombre de su conjunto de reglas) a $XKBLOCAL$/rules/evdev y agregue reglas que apunten a las opciones que hemos creado. Tiene dos opciones aquí: 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 existentes, no necesita realizar ninguna copia, solo editarlos.

    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 añadido. Como en el paso anterior, puede copiar todo el archivo o solo la parte a la que hace referencia el modelo, diseño, variante y opción(es) que está utilizando. Sólo 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. Bien, 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 quizás 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. Por lo tanto, la línea de comando completa es 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 fuehttp://madduck.net/docs/extending-xkb/.

Respuesta3

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

En la aplicación del 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 la terminal Gnome X. Simplemente seleccione el acceso directo (por ejemplo, "copiar") e ingrese la secuencia de teclas deseada.

En caso de que los atajos 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 copiar (para que el terminal X cumpla con el estándar CUA)?

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

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

Luego fuente .bashrc.

Toda la solución 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 echo de una línea. Muy simple y cubre casi todo lo que necesito.

Respuesta4

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

xmodmap -e 'remove Mod4 = Super_L'

información relacionada