In Linux, come posso mappare SHIFT_L / SHIFT_R se premuto senza tasto aggiuntivo?


13

Oggi ho trovato questo bellissimo articolo di Steven Losh in cui presenta un paio di aumenti della produttività delle mappature della tastiera. Tra questi c'è una mappatura dinamica dei tasti shift sinistro e destro.

L'idea

Quando si premono Shift_L o Shift_R senza un tasto aggiuntivo, vengono mappati rispettivamente su '(' e ')', altrimenti funzionano normalmente.

Il problema

Fa tutto questo sotto OSX. Sto cercando di ottenere lo stesso su Linux. Non esiste un modo semplice per farlo poiché, come ho capito, non è possibile utilizzare xmodmap per configurare una chiave per Shift_L da sola e un'altra per Shift quando viene utilizzata come chiave modificatrice.

Ho cercato su Google un po 'e ho trovato persone che cercavano di fare lo stesso con Windows, il che è apparentemente possibile usando AutoHotKey, ma non sono riuscito a trovare nulla per Linux.

C'è un modo per risolverlo sotto Linux?


Non l'ho provato ma questo potrebbe aiutare askubuntu.com/q/24916/11352
Mansuro

2
È quasi duplicato a questa domanda . =)
teika kazura,

Risposte:


4

Wow! Il commento dell'utente teika kazura sulla domanda originale è abbastanza corretto: non solo questo è effettivamente un duplicato di quell'altra domanda , ma la risposta fornita lì ("usa xcape ") risolve questo problema!

Dopo aver clonato il repository xcape e compilato (ho dovuto installare libXtst-devel sulla mia casella Fedora, prima), sono stato in grado di ottenere il comportamento esatto richiesto con il seguente comando:

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

Dopo i test dichiaratamente rapidi, sembra funzionare molto bene. Bello!

Altre opzioni

Se usi il tasto MAIUSC come modificatore del mouse (ovvero se fai mai clic con il tasto MAIUSC), probabilmente vorrai includere l'opzione di timeout di xcape e trovare un valore di timeout confortevole, in modo che i tasti Shift da solo usati in combinazione con il mouse don non genera parentesi spurie. Dal README di xcape:

-t <timeout ms>

Se si tiene una chiave più a lungo di questo timeout, xcape non genererà un evento chiave. L'impostazione predefinita è 500 ms.

Quindi, includendo la -tbandiera con un valore di timeout che funziona per te, sarai comunque in grado di premere il tasto Maiusc e fare clic con il mouse finché tieni premuto Maiusc per almeno timeout ms millisecondi.

(Ringraziamo ancora teika kazura per aver sottolineato l'altra domanda, e anche don_crissti per la risposta originale lì.)


Un problema con questo metodo è che spesso premo [Shift] + [LMouse] per selezionare del testo negli editor. È interessante notare che Sublime Text utilizza anche [Ctrl] + [LMouse], quindi anche la domanda sulla rimappatura [Ctrl] causa problemi.
AnnanFay,

@Annan Hai provato a regolare l'opzione di timeout di xcape? Da README: " -t <timeout ms>Se si tiene una chiave più a lungo di questo timeout, xcape non genererà un evento chiave. L'impostazione predefinita è 500 ms." ... A meno che xcape non interferisca con l'evento key-down del modificatore (non ricordo), ciò dovrebbe impedirgli di generare tasti falsi, pur permettendoti di usarlo come modificatore di selezione del mouse finché lo tieni abbastanza a lungo .
FeRD

@Annan È bello sentirlo, ho aggiornato la mia risposta per suggerire l'utilizzo della -tbandiera!
FERD

1

È una sfida interessante e sono d'accordo sul fatto che xinput non sembra perfettamente adatto. Ho trascorso qualche tempo trafficando con le abilità di xmodmap, ed è venuto così frustrante vicino al raggiungimento di quello che si vuole fare ... senza realmente gestire per arrivarci.

Usando xmodmap, è possibile assegnare parenleft come un simbolo di tasto spostato sul tasto di spostamento sinistro:

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

che SortA lavori, almeno in prova sulla mia casella di Fedora 17, ma non in modo soddisfacente. Ho scoperto che, con questa mappatura in atto, il tasto MAIUSC funzionava ancora normalmente e non rendeva alcun paragone spurio, ma (frustrantemente) non produceva neppure parens di sinistra in modo affidabile. Per qualsiasi motivo, la chiave non sembra modificare in modo affidabile se stessa , che rompe la sua assegnazione spostato ... inizialmente. Per qualsiasi motivo, colpire il turno di sinistra alcune volte in successione alla fine indurrebbe a iniziare a produrre i genitori di sinistra, ma solo dopo la quarta o la quinta stampa.

Un comportamento che ho notato, tuttavia, è che potresti essere in grado di lavorare come analogo "abbastanza vicino": ho scoperto che dopo aver mappato parenleft e parenright su Shift_L e Shift_R, avrei potuto digitare in modo affidabile le parentesi "scorrendo" su entrambi i tasti shift - in altre parole, con questa mappatura:

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

premendo Shift_L seguito da Shift_R, quindi rilasciando entrambi, si produrrebbe un paren destro o un paren sinistro nell'altra direzione. (Le mappature dei genitori potrebbero essere invertite, ovviamente; non riuscivo a decidere in che modo fosse più "naturale".)

Questo è stato il più vicino possibile al raggiungimento del comportamento esatto che stai cercando; non sembra che sia possibile usare solo xmodmap.

Ero a metà convinto che semplicemente non fosse possibile, punto, ma poi mi sono reso conto che c'è almeno un tasto che funziona esattamente come descrivi tu: il tasto Super ("Windows"). Sotto Gnome Shell, è un tasto modificatore (mod4), che produce un effetto diverso (innescando Panoramica) se premuto da solo. Quindi, almeno in teoria, potrebbe essere possibile implementare il sovraccarico del tasto maiuscole desiderato allo stesso modo.

... Ma non ho assolutamente idea di come sarebbe fatto, o di quanto invasivo sarebbe impantanarsi nell'elaborazione necessaria ogni volta che premi il tasto Maiusc. :-)


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.