Xmodmap permanente en Ubuntu 13.04

72

No puedo hacer que xmodmap se ejecute al iniciar sesión en Ubuntu 13.04. He buscado alrededor, incluso en askubuntu y todas las respuestas que encontré no funcionan.

Tengo un archivo llamado .Xmodmap en mi carpeta de inicio que contiene las asignaciones deseadas. Si lo ejecuto manualmente, funciona bien, por lo que no hay ningún error allí. Para que se ejecute al inicio, he intentado:

  1. Usando varios que .xinitrccontienen uno de los siguientes comandos:

    • xmodmap .Xmodmap
    • xmodmap ~/.Xmodmap
    • /usr/bin/xmodmap /home/NAME/.Xmodmap
    • if [ -s ~/.Xmodmap ]; then
      xmodmap ~/.Xmodmap
      fi
  2. Utilizando en .Xresourceslugar de .xinitrccon las mismas variaciones.

  3. Configurarlo como una aplicación de inicio.

Ninguno de los anteriores funciona en Ubuntu 13.04 (64 bits). También vi algunas ideas sobre cómo cambiar globalmente las asignaciones de teclado, pero la mayoría de ellas no eran aplicables en Ubuntu 13.04 (es decir, los archivos correspondientes no existían donde se especificaba) y prefiero no tocar la configuración global de todos modos.

Alexander Karatarakis
fuente

Respuestas:

81

Ubuntu ya no usa xmodmap, sino que usa xkb(por lo que yo entiendo, esto facilita los diseños de teclado por ventana, entre otras cosas).

Los archivos de mapa de todo el sistema están en

/usr/share/X11/xkb/symbols/

Los mapas parecen estar cargados jerárquicamente, con el pcmapa como raíz, y cualquier idioma (p en. Ej. ) Como hijo de la raíz.

En mi caso particular, cambié físicamente Page Up con Home y Page Down con End en mi teclado, así que hice cambios crudos en el pcmapa de todo el sistema , de la siguiente manera:

 key <HOME> {    [  Prior        ]   };
 key <PGUP> {    [  Home         ]   };
 key  <END> {    [  Next         ]   };
 key <PGDN> {    [  End          ]   };

NOTA: Para obligar a Xorg a usar su nuevo mapa de teclado, es posible que deba eliminar los mapas precompilados existentes (* .xkm) en

/var/lib/xkb/

y luego reinicie Xorg.

Hay varios recursos xkb, pero este está relacionado con Ubuntu.

Daniel
fuente
9
A partir de Ubuntu 14.04, esta es lamentablemente la forma más fácil de intercambiar claves. PUEDE hacer que xmodmap se ejecute al iniciar sesión agregándolo a las Aplicaciones de inicio, pero si suspende, hiberna, etc., debe iniciarlo manualmente o crear scripts de inicio de demonio.
holocronweaver
Puedo volver a asignar las teclas de función de modificadores: unmodified shift altgr* shift+altgr. Pero ¿qué pasa left alty super key?
Farzher
77
No creo que tu primera oración sea verdadera. ¿Tienes alguna fuente para ello? Me resulta difícil creer que "la forma de Ubuntu" de reasignar las teclas sería editar los mapas del teclado xkb. Además de ser críptico, esto tiene el problema de que tus mapas personalizados se eliminan cuando xkbse actualizan.
Mateus Araújo
1
Dicho esto, este es el único método confiable que he encontrado para reasignar claves en Ubuntu.
Mateus Araújo
1
Tiene que haber una mejor manera. Sé el código clave exacto que quiero asignar, pero el código clave 217 ni siquiera aparece en xkb. Ni siquiera veo una manera de agregar nuevos códigos clave.
Jonathan
13

Para mí, la configuración de xkb es demasiado complicada si desea reasignar 1 o 2 teclas de una manera que no está disponible en la Configuración del sistema. Además, la solución debe permanecer en el lado del usuario, sin editar '/ usr / share / X11 / xkb / symbols /' etc. Forzar la carga de 'xmodmap ~ / .Xmodmap' usando las Aplicaciones de inicio solo funciona hasta que suspenda, cambie de usuario o cambiar la distribución del teclado. Entonces, como sugiere holocronweaver, con los fragmentos de código que encontré, hice un script de Python para cargar al inicio de la sesión, que recarga el '~ / .Xmodmap' cuando es necesario.

Consulte el informe de error # 1243642 (comentario # 6) y descárguelo aquí .

dedalu
fuente
1
Todavía trabajando a partir de 15.10 :-) ¡Gracias!
lalomartins
El enlace a este legendario guión parece estar roto. ¿Podría alguien ponerlo en github?
Epigene
¡Excelente, y solo viable, respuesta! Trabajando en 16.04. Para que funcione en Python3 cambió: "import gobject" a "from gi.repository import GObject as gobject".
Craig Hicks
1
@Epigene - el enlace está ahí ahora
Craig Hicks
¡Alabado sea! Un genio trabaja alrededor.
dmanexe
6

Tuve este problema en Ubuntu 14.04, y encontré la solución aquí . Aparentemente, Ubuntu no puede configurar el teclado inmediatamente después de iniciar sesión, pero es un poco más tarde. Entonces, si agrega un comando

sleep 4 && xmodmap ~/.Xmodmap &

a ~/.bash_profilecontinuación, que debería funcionar (lo hace para mí).

EDITAR: Esto parece funcionar solo después de iniciar sesión, no después de iniciar. Tendré que investigar esto más tarde.

dremodaris
fuente
1
¿Alguna suerte configurando esto para que se ejecute después de suspender / hibernar?
Jonathan
No, desafortunadamente aún no puedo hacer que funcione después del arranque. Así que cada vez que inicio, abro una terminal y xmodmap ~/.Xmodmap
escribo
ten en cuenta que en ubuntu 16.04 deberías usar .profile
Vitor Abella
5

Convertir Caps Locken Escpara vimuso

Aquí está mi variante de un script de inicio de mapeo de claves. Se convierte Caps Locken Esccualquier teclado para usar con vi, vimo gvim.

A diferencia de la respuesta de q4w56 , esta respuesta no usa ningún while; dobucle infinito . De lo contrario, un núcleo de mi CPU de doble núcleo alcanzaría el 42% cada 5 segundos, reduciendo severamente la carga de la batería de mi computadora portátil.

#!/usr/bin/env bash
sleep 4
xmodmap -e "clear Lock"
xmodmap -e "keysym Caps_Lock = Escape"

Guárdelo como un guión. Haga que el archivo sea ejecutable con chmod +x. Agregue el nombre del script y la ubicación a Session and Startup → Application Autostart(en Xubuntu).

El comportamiento del teclado para este usuario permanecerá persistente durante el reinicio y el cierre de sesión, pero no se suspenderá. La persistencia a través de la suspensión se puede lograr , pero desafortunadamente solo a nivel del sistema, no fácilmente a nivel del usuario.

Justificación de esta reasignación de teclado

En el mundo informático actual, queda muy poco uso para la Caps Lockclave. En general, uno debe abstenerse de usar ALL CAPS en virtud tanto de la netiquette como de la separación de la presentación y el contenido . Además, Caps Lockpresionar accidentalmente la tecla mientras se edita el texto vimno siempre se nota de inmediato, pero invariablemente resulta en un comportamiento bastante molestovim más adelante. Desactivar la Caps Lockclave todos juntos y reutilizarla como una Escclave fácil de alcanzar resulta en una doble victoria para su vimuso.

Serge Stroobandt
fuente
Reemplazar la función de la Caps Lockclave podría ser un verdadero salvavidas para los vimusuarios de Apple MacBooks sin una Escclave .
Serge Stroobandt
3
Es mejor reasignar el capslockto ctrl. Esto resuelve muchos más problemas, y en Vim, entonces, puedes usar capslock+ [para EscPerdón por entrometerse, pero me sentí obligado a sugerir esto.
user907860
¿Qué es exactamente suspender? ¿Eso está cerrando la tapa de tu computadora portátil? ¿Después de eso tu solución no funciona? ¿Cómo usa vim después de cerrar la tapa de su computadora portátil?
Marko Avlijaš
@ MarkoAvlijaš How do you use vim after you close the lid on your laptop?Al abrir la tapa, por supuesto!
Serge Stroobandt
Jaja, nunca adivinaría eso. ¿Quiero decir que el bloqueo de mayúsculas ya no está asignado a esc después de eso?
Marko Avlijaš
3

También tuve el problema en Ubuntu 16.04 con fcitx, y tenía la solución en el wiki de fcitx , pero necesitaba fcitx tiene 4.2.7 o posterior

  • touch ~/.Xmodmap
  • escribe la configuración
  • reiniciar y el fcitx intentará cargarlo automáticamente

También hay alguna explicación por la razón.

Bluethon
fuente
1
Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
Videonauth
@Videonauth He modificado mi respuesta
Bluethon
Muchas gracias :) Dejo mi comentario aquí aún para que las personas en la revisión puedan ver que cambiaste algo.
Videonauth
@Videonauth esta es mi primera respuesta y soy pobre en inglés, así que cometí un error. y gracias por tu consejo. : P
Bluethon
De nada. Brindar respuestas es una buena manera de contribuir a la comunidad.
Videonauth
3

@ La respuesta de Daniel me señaló el camino correcto, pero me gustaría ampliarlo.

Funciona para mí en Linux Mint 17.2 y Ubuntu 16.04.

Intenté todos los giros que se me ocurrieron para seguir usando xmodmap, pero todos fallan cuando el sistema entra en modo de suspensión. Lo mismo se aplica incluso a los scripts de aplicación de inicio que se usan setxkbmapen casos donde el * settings-daemon (para mí es xfce4) se ejecuta más tarde que el script --- y el orden no puede verse realmente influenciado.

Lo que finalmente se me ocurrió tiene los siguientes ingredientes:

1) Escriba un archivo de asignación de teclado mínimo para /usr/share/X11/xkb/symbols. Llamemos al archivo mylayoutPuede ser tan simple como

xkb_symbols "basic" {
  name[Group1] = "My Layout";
  include "us"
  key <AE03> { [ 3, numbersign, sterling, sterling] };
  include "level3(ralt_switch)"
}
  • basic es solo un nombre, lo veremos más tarde.
  • De name[Group1]manera similar, es solo un nombre, pero no desempeñará ningún papel más adelante.
  • include "us"incluye el llano us teclado. En realidad uses otro archivo en el mismo directorio. Este es el diseño del teclado que estamos adaptando. Elija uno diferente según sea necesario. Nota: no hay punto y coma para finalizar esta línea.
  • La keylínea es una adaptación del teclado, más pueden seguir. El <AE03>se puede encontrar en los archivos debajo /usr/share/X11/xkb/keycodes. Use el xevprograma para descubrir que la tecla "3" tiene el código clave 12 y en el archivo de códigos clave al Xfree86que está asignado <AE03>.
  • Finalmente, otra includedirectiva para activar otra opción de teclado, en este caso, quiero tener la tecla Alt correcta para ser la tecla shift de nivel 3, es decir, la tecla que da acceso al sterlingsigno que definí anteriormente. level3es solo un nombre de archivo en la misma carpeta con ralt_switchuna sección. Eche un vistazo y elija lo que necesita incluir.

2) Yo no pongo la mylayouten la carpeta del sistema. En cambio, solo hice un enlace suave desde la carpeta del sistema a una carpeta de mi agrado para ver de inmediato que este no es un software de stock.

3) Además, no lo solucioné evdev.xml, nuevamente para evitar problemas de actualización. Pero esto sería necesario para encontrar mylayout en el editor de configuración del teclado (para xfce4 lo es xfce4-keyboard-settings). En su lugar, usé xfce4-settings-editory cambié keyboard-layout->XkbLayouta mylayout(el nombre del archivo) y XkbVarianta basic(ver arriba). Posteriormente, también mylayout/basicse muestra en el editor de configuración del teclado. Una entrada en evdev.xmlparece ser solo necesaria para poder seleccionar el diseño.

De esta manera, la configuración del teclado ahora sobrevive al modo de suspensión y se reinicia.

Puede encontrar más antecedentes aquí: http://www.charvolant.org/~doug/xkb/html/node5.html .

Aquí puede encontrar otro enfoque para solucionar el problema del modo de suspensión (no lo intenté yo mismo): https://www.vinc17.net/unix/xkb.en.html .

ACTUALIZACIÓN: trabajé con Mint 18.3 en el mismo momento en que cambié la configuración en xfce4-settings-editor como se describió anteriormente.

ACTUALIZACIÓN: con 18.04, gdm3 como administrador de pantalla y XFCE4 como administrador de ventana, parece que ~ / .Xmodmap se lee nuevamente y la configuración parece sobrevivir a una suspensión. (Raramente uso suspender y nunca estoy seguro de en qué modo se encuentra la computadora portátil).

Harald
fuente
2

REVISIÓN

Una actualización a principios de 2018 rompió la persistencia: recarga automática del mapa de teclas después de suspender o hibernar. Dado que los métodos que usan los scripts /etc/pm/sleep.d dejaron de funcionar (¿en desuso?), Eso dejó solo la forma más nueva, usando / lib / systemd / system-sleep y secuencias de comandos ligeramente diferentes (¡que comenzaron a funcionar en mapas de teclas!).

Por lo tanto, esta publicación se actualiza al método más nuevo para la persistencia y para incluir la carga normal del mapa de teclas inicial, que también comenzó a funcionar. La rutina para convertir un archivo .Xmodmap a .xkbmap permanece sin cambios.

Tenga en cuenta que esta es una solución por usuario. Para obtener una respuesta por dispositivo, vea cómo aplicar un mapa de teclas a un solo dispositivo . Este método podría adaptarse para su uso aquí.

Primero modifique el archivo .Xmodmap como desee. Estos son más fáciles de editar directamente que los archivos .xkbmap. Cuando está cargado:

xmodmap .Xmodmap

luego conviértalo a un archivo .xkb:

xkbcomp $ DISPLAY $ HOME / .xkbmap

Para cargar automáticamente al inicio, abra Aplicaciones de inicio, haga clic en Agregar, y en la línea de comando ingrese:

xkbcomp /home/user/.xkbmap ": 0"

("usuario" se reemplaza con el nombre de usuario real). Para Nombre, quizás ingrese Cargar mapa del teclado. Agregue un comentario si lo desea y presione Guardar.

El mapa de teclas ahora se cargará cada vez que se inicie el sistema, pero no sobrevivirá a una suspensión o hibernación. Para esto, cree un nuevo archivo en / lib / systemd / system-sleep, quizás llamado 60_xkbmap, que contiene:

#!/bin/sh
case $1/$2 in
  pre/*)
    # Place pre-suspend commands here
    exit 0
    ;;
  post/*)
    # Place post-suspend commands here
    export DISPLAY=":0"
    export XAUTHORITY="/home/user/.Xauthority"
    su user -c "xkbcomp /home/user/.xkb/xkb-map $DISPLAY 2>/dev/null"
    ;;
esac

( Ref. ) Como arriba, reemplace "usuario" con el nombre de usuario real.

El mapa de teclas ahora debería cargarse automáticamente y permanecer persistente. Nota:

  • Se aplica a la versión actual de LTS, 16.04, y probablemente también a versiones posteriores.
  • Tomado de la publicación 14 del hilo de error vinculado anteriormente.
  • Los comentarios anteriores se aplicaron a la publicación original.
u2n
fuente
Estoy probando este método de vez en cuando cuando inicio un terminal recibo un montón de mensajes como este: Advertencia: No hay símbolos definidos para <AB11> (código clave 97) Advertencia: No hay símbolos definidos para <JPCM> (código clave 103) Advertencia: No hay símbolos definidos para <I120> (código clave 120) ... muchos más no están seguros de cuáles serán las consecuencias de eso todavía. ¿Nadie sabe?
bebé perdido el
Este método, a pesar de las advertencias mencionadas anteriormente, funciona solo temporalmente, después de un tiempo, el mapeo de alguna manera se olvida y la súper clave vuelve a su función predeterminada. Así que lo intentaré al revés: reasignaré los accesos directos de edición básicos en mi Mac para usar la tecla Control en lugar de la tecla Comando y ver si eso funciona. Solo quiero que mis comandos cortar-copiar-pegar-deshacer-rehacer sean los mismos en Mac y Ubuntu. Me siento muy frustrado cuando aparece el menú de búsqueda en Ubuntu cada vez que intento copiar o pegar algo.
bebé perdido el
1

Esto también me hizo tropezar cuando actualicé Ubuntu 12.04 a 13.04.

Afortunadamente, esta configuración es ahora (o quizás siempre ha sido) fácilmente accesible en las preferencias del teclado y se puede cambiar con unos pocos clics del mouse.

  1. Vaya a Configuración del sistema > Distribución del teclado > Opciones ...
  2. En las Opciones de distribución del teclado, haga clic en la flecha para mostrar las opciones de posición de la tecla ▸ Ctrl .
  3. Ponga la marca de verificación en Swap Ctrl y Caps Lock .

Ahí tienes: el control izquierdo y el bloqueo de mayúsculas han cambiado de posición.

No olvide eliminar ~/.Xmodmapuna vez que haya realizado el cambio.

glts
fuente
Tal vez fue rechazado porque no aborda xmodmap, pero así fue como descubrí que el uso de Gnome Tweak puede haber sido la razón por la cual algunas de mis asignaciones estaban actuando de manera extraña.
dragon788
No veo esto en 16.04, ¿todavía es posible?
chrismarx
1
@chrismarx No, lo eliminaron. Hoy en día (16.04) me puse XKBOPTIONS="ctrl:swapcaps"en /etc/default/keyboard.
glts
0

Encuentro satisfactorio agregar este script al inicio:

while true;do 
    xmodmap -e "keycode 87=Prior"
    xmodmap -e "keycode 88=Next"
    sleep 5
done

Intenté usarlo xmodmap ./Xmodmap, pero cada vez que se ejecuta, se producirá un retraso notable.

golopot
fuente
44
Se while; dodebe evitar el uso de cualquier bucle infinito . ¡Causó que un núcleo de mi CPU de doble núcleo alcanzara el 42% cada 5 segundos, reduciendo severamente la carga de la batería de mi laptop!
Serge Stroobandt