En Linux, ¿cómo puedo asignar SHIFT_L / SHIFT_R cuando se presiona sin tecla adicional?

13

Hoy encontré este muy buen artículo de Steven Losh en el que presenta un par de asignaciones de teclado que aumentan la productividad. Entre ellos se encuentra un mapeo dinámico de las teclas de desplazamiento izquierda y derecha.

La idea

Cuando se presionan Shift_L o Shift_R sin una tecla adicional, se asignan a '(' y ')' respectivamente, de lo contrario funcionan como de costumbre.

El problema

Él hace todo esto bajo OSX. Estoy tratando de lograr lo mismo con Linux. No hay una forma directa de hacerlo, ya que entiendo que no puede usar xmodmap para configurar una tecla solo para Shift_L, y otra para Shift cuando se usa como una tecla modificadora.

Busqué en Google un poco y encontré personas que intentaban hacer lo mismo en Windows, lo que aparentemente es posible usando AutoHotKey, pero no pude encontrar nada para Linux.

¿Hay alguna manera de resolver esto en Linux?

gilligan
fuente
No lo he probado, pero esto podría ayudar a askubuntu.com/q/24916/11352
Mansuro
2
Es casi duplicado a esta pregunta . =)
teika kazura

Respuestas:

4

¡Guauu! El comentario del usuario teika kazura sobre la pregunta original es bastante correcto, no solo es efectivamente un duplicado de esa otra pregunta , sino que la respuesta provista allí ("use xcape ") resuelve este problema.

Después de clonar el repositorio xcape y compilar (primero tuve que instalar libXtst-devel en mi caja Fedora), pude obtener el comportamiento exacto solicitado con el siguiente comando:

xcape -e "Shift_L=parenleft;Shift_R=parenright"

Después de una prueba superficial, parece funcionar extremadamente bien. ¡Agradable!

Otras opciones

Si usa la tecla Shift como modificador del mouse (es decir, si alguna vez hace clic con la tecla Mayúsculas presionada), probablemente desee incluir la opción de tiempo de espera de xcape y encontrar un valor de tiempo de espera cómodo, de modo que las teclas Shift solas se usen en combinación con el mouse don No generes paréntesis espurios. Desde el xcape README:

-t <timeout ms>

Si mantiene presionada una tecla durante más tiempo que este tiempo de espera, xcape no generará un evento clave. El valor predeterminado es 500 ms.

Por lo tanto, al incluir la -tbandera con un valor de tiempo de espera que funcione para usted, aún podrá hacer clic con el mouse mientras mantiene presionada la tecla Mayús durante al menos timeout ms milisegundos.

(Crédito, nuevamente, a teika kazura por señalar la otra pregunta, y también a don_crissti por la respuesta original allí).

FeRD
fuente
Un problema con este método es que a menudo presiono [Shift] + [LMouse] para seleccionar texto en los editores. Curiosamente, Sublime Text también usa [Ctrl] + [LMouse], por lo que la pregunta sobre la reasignación [Ctrl] también causa problemas.
AnnanFay
@Annan ¿Has experimentado con el ajuste de la opción de tiempo de espera de xcape? Desde el archivo README: " -t <timeout ms>Si mantiene presionada una tecla por más tiempo que este tiempo de espera, xcape no generará un evento clave. El valor predeterminado es 500 ms". ... A menos que xcape interfiera con el evento de pulsación de tecla del modificador (no recuerdo), eso debería evitar que genere pulsaciones de teclas espurias, al tiempo que le permite usarlo como un modificador de selección de mouse siempre que lo mantenga presionado el tiempo suficiente .
FeRD
@ Annan ¡Qué bueno escucharlo, he actualizado mi respuesta para sugerir la utilización de la -tbandera!
FeRD
1

Es un desafío interesante, y estoy de acuerdo con uno para el que xinput no parece estar perfectamente adaptado. Pasé un tiempo jugueteando con las habilidades de xmodmap, y estuve tan frustrantemente cerca de lograr lo que quieres hacer ... sin lograr llegar allí.

Usando xmodmap, es posible asignar parenleft como un símbolo de tecla desplazado en la tecla de desplazamiento a la izquierda:

xmodmap -e 'keysym Shift_L = Shift_L parenleft Shift_L parenleft'

el cual sorta obras, al menos en las pruebas en mi caja de Fedora 17, pero no de una manera satisfactoria. Descubrí que, con este mapeo en su lugar, la tecla de mayúsculas todavía funcionaba normalmente y no mostraba ningún paréntesis espurio, pero (frustrantemente) tampoco producía de manera confiable parentescos izquierdos. Por alguna razón, la clave no parece modificar de forma fiable en sí , que rompe su cometido ... desplazado inicialmente. Por alguna razón, presionar el desplazamiento a la izquierda varias veces seguidas eventualmente provocaría que comience a producir padres izquierdos, pero solo después de la cuarta o quinta pulsación.

Un comportamiento que hice aviso, sin embargo, que es posible que pueda trabajar con como un análogo "lo suficientemente cerca": He encontrado que después de parenleft mapeo y parenright en Shift_L y Shift_R, podría escribir de forma fiable parens por "rodar" a través de las dos teclas de mayúsculas - en otras palabras, con este mapeo:

xmodmap -e 'keysym Shift_L = Shift_L parenleft Shift_L parenleft'
xmodmap -e 'keysym Shift_R = Shift_R parenright Shift_R parenright'

presionando Shift_L seguido de Shift_R, luego soltando ambos, generaría un par derecho o un par izquierdo en la otra dirección. (Las asignaciones de paren podrían invertirse, por supuesto; no pude decidir de qué manera se sentía más "natural").

Eso fue lo más cerca que llegué a lograr el comportamiento exacto que estás buscando; no parece posible usar solo xmodmap.

Estaba medio convencido de que simplemente no es posible, punto, pero luego me di cuenta de que hay al menos una tecla que funciona exactamente como usted describe: la tecla Súper ("Windows"). Bajo Gnome Shell, es una tecla modificadora (mod4), que produce un efecto diferente (desencadenando Descripción general) cuando se presiona solo. Entonces, al menos en teoría, puede ser posible implementar la sobrecarga de teclas de cambio deseada de la misma manera.

... Pero, no tengo ni idea de cómo se haría eso, o de lo invasivo que sería empantanarse en el procesamiento necesario cada vez que presione la tecla Shift. :-)

FeRD
fuente