lunedì 23 settembre 2013

Rimappare tasti della tastiera e scambiare numeri con simboli

Trovo la configurazione della tastiera italiana su GNU/Linux (guardate l'ultima figura qui) abbastanza comoda, però tutto si può sempre migliorare. In questo post spiegherò come si cambiano le funzioni dei tasti.

Gli strumenti che servono sono due: xev (per scoprire il codice del tasto e il nome della funzione da eseguire) e xmodmap (per modificare le funzioni associate ai tasti). Entrambi questi programmi, che si usano da linea di comando, fanno parte del server grafico X.org e sono preinstallati nella maggior parte delle distribuzioni. I pacchetti che forniscono questi programmi su Debian e Ubuntu sono x11-utils e x11-xserver-utils.

Per prima cosa bisogna scoprire qual è il codice associato a un tasto. Per fare ciò bisogna eseguire in un terminale il comando
xev
Si aprirà una finestra grafica, mentre sul terminale scorreranno dei messaggi. I messaggi che appaiono appena si avvia il programma non sono importanti. A questo punto bisogna premere il tasto di cui si vuole conoscere il codice. Per esempio, premendo il tasto m apparirà nel terminale il messaggio
KeyRelease event, serial 40, synthetic NO, window 0x4600001,
    root 0x251, subw 0x0, time 7126899, (-210,874), root:(330,897),
    state 0x10, keycode 58 (keysym 0x6d, m), same_screen YES,
    XLookupString gives 1 bytes: (6d) "m"
    XFilterEvent returns: False
Le righe che dobbiamo guardare sono la terza e la quarta: nella terza è riportato il keycode, il codice del tasto (nell'esempio il codice è 58) e il nome della funzione fra parentesi, dopo keysym e un numero esadedecimale (nell'esempio la funzione è m). Invece nella quarta riga possiamo vedere qual è il simbolo effettivamente inserito (m nell'esempio). Il codice del tasto è indipendente dagli eventuali tasti modificatori premuti, come SHIFT e ALT GR, il codice è sempre lo stesso, quello che cambieranno saranno le funzioni associate e i caratteri inseriti.

Facciamo un'altra prova: premiamo il tasto n in una sessione di xev, il corrispondente output sarà
KeyRelease event, serial 40, synthetic NO, window 0x4600001,
    root 0x251, subw 0x0, time 8118563, (523,450), root:(1063,473),
    state 0x10, keycode 57 (keysym 0x6e, n), same_screen YES,
    XLookupString gives 1 bytes: (6e) "n"
    XFilterEvent returns: False

Il comando xmodmap permette di rimappare le funzioni dei tasti. La sintassi del comando da usare è
xmodmap -e "keycode CODICE = FUNZIONE"
sostituendo a CODICE il codice del tasto e a FUNZIONE la funzione da eseguire. Per esempio, per inserire una n premendo il tasto m si deve usare il comando
xmodmap -e "keycode 58 = n"
Dopo l'uguale si possono inserire fino a otto funzioni differenti, separate da uno spazio: la prima è la funzione eseguita premendo il tasto da solo, la seconda è quella corrispondente all'azione SHIFT + tasto, la terza è quella eseguita premendo ALT GR + tasto, la quarta è quella corrispondente a SHIFT + ALT GR + tasto. Le ultime quattro funzioni non sono generalmente utilizzate. Quindi per inserire una n premendo il tasto m e una N premendo SHIFT + m bisogna cambiare il comando precedente in
xmodmap -e "keycode 58 = n N"

Il comando
xmodmap -pke
mostra sullo schermo tutte le funzioni associate a tutti i tasti della propria tastiera. L'output sarà qualcosa del tipo:
...
keycode  22 = BackSpace BackSpace BackSpace BackSpace BackSpace BackSpace
keycode  23 = Tab ISO_Left_Tab Tab ISO_Left_Tab Tab ISO_Left_Tab
keycode  24 = q Q q Q at Greek_OMEGA at
keycode  25 = w W w W lstroke Lstroke lstroke Lstroke
keycode  26 = e E e E EuroSign cent EuroSign
keycode  27 = r R r R paragraph registered paragraph
keycode  28 = t T t T tslash Tslash tslash Tslash
keycode  29 = y Y y Y leftarrow yen leftarrow
keycode  30 = u U u U downarrow uparrow downarrow
keycode  31 = i I i I rightarrow idotless rightarrow
keycode  32 = o O o O oslash Oslash oslash Oslash
keycode  33 = p P p P thorn THORN thorn THORN
keycode  34 = egrave eacute egrave eacute bracketleft braceleft bracketleft
keycode  35 = plus asterisk plus asterisk bracketright braceright bracketright
keycode  36 = Return NoSymbol Return NoSymbol Return
keycode  37 = Control_L NoSymbol Control_L NoSymbol Control_L
keycode  38 = a A a A ae AE ae AE
keycode  39 = s S s S ssharp section ssharp
keycode  40 = d D d D eth ETH eth ETH
...
Possiamo sfruttare queste informazioni per scambiare completamente due tasti senza cercare manualmente una a una tutte le funzioni associate a un tasto, insieme ai possibili modificatori. Per esempio, per scambiare i tasti q (codice 24) e p (codice 33) si possono usare i comandi:
xmodmap -e "keycode  33 = q Q q Q at Greek_OMEGA at"
xmodmap -e "keycode  24 = p P p P thorn THORN thorn THORN"

Il comando xmodmap modifica le associazioni dei tasti solo per la sessione corrente del server X.org. Per rendere permanenti le modifiche bisogna salvare le espressioni keycode CODICE = FUNZIONI in un file e fare in modo che xmodmap carichi quel file ogni volta che si avvia il server grafico X.org. Generalmente il file in cui si salvano queste impostazioni si chiama ~/.xmodmaprc (il nome in realtà è lasciato alla libera scelta dell'utente, il nome suggerito deriva solo da una convenzione diffusa), mentre nel file ~/.xinitrc si aggiungerà (se il file non esiste bisogna crearlo) il comando
xmodmap .xmodmaprc

Nelle tastiere dotate di tastierino numerico sono presenti due tasti per inserire ciascuna cifra. Per eliminare questa ridondanza si possono scambiare, nei tasti numerici sopra le lettere, i simboli con i numeri. Per essere più chiari, si può fare in modo che premendo il tasto 1 sia inserito il simbolo !, premendo il tasto 2 sarà inserito il simbolo ", premendo 3 si inserirà £ ecc... mentre per inserire i corrispondenti numeri bisognerà premere SHIFT + tasto. Nelle tastiere con layout italiano l'output del comando xmodmap -pke corrispondente a questi dieci tasti numerici è
keycode  10 = 1 exclam 1 exclam onesuperior exclamdown onesuperior
keycode  11 = 2 quotedbl 2 quotedbl twosuperior dead_doubleacute twosuperior
keycode  12 = 3 sterling 3 sterling threesuperior dead_tilde threesuperior
keycode  13 = 4 dollar 4 dollar onequarter oneeighth onequarter
keycode  14 = 5 percent 5 percent onehalf threeeighths onehalf
keycode  15 = 6 ampersand 6 ampersand notsign fiveeighths notsign
keycode  16 = 7 slash 7 slash braceleft seveneighths braceleft
keycode  17 = 8 parenleft 8 parenleft bracketleft trademark bracketleft
keycode  18 = 9 parenright 9 parenright bracketright plusminus bracketright
keycode  19 = 0 equal 0 equal braceright dead_ogonek braceright
Per realizzare quanto suggerito basta inserire nel file ~/.xmodmaprc le espressioni precedenti invertendo le funzioni numeriche con i simboli (per esempio bisogna invertire exclam con 1 nella riga corrispondente al tasto con codice 10). Per concretezza riporto qui il codice da inserire nel file:
keycode  10 = exclam 1 exclam 1 onesuperior exclamdown onesuperior
keycode  11 = quotedbl 2 quotedbl 2 twosuperior dead_doubleacute twosuperior
keycode  12 = sterling 3 sterling 3 threesuperior dead_tilde threesuperior
keycode  13 = dollar 4 dollar 4 onequarter oneeighth onequarter
keycode  14 = percent 5 percent 5 onehalf threeeighths onehalf
keycode  15 = ampersand 6 ampersand 6 notsign fiveeighths notsign
keycode  16 = slash 7 slash 7 braceleft seveneighths braceleft
keycode  17 = parenleft 8 parenleft 8 bracketleft trademark bracketleft
keycode  18 = parenright 9 parenright 9 bracketright plusminus bracketright
keycode  19 = equal 0 equal 0 braceright dead_ogonek braceright
Bisogna farci l'abitudine, ma questa nuova configurazione può risultare molto conveniente.

martedì 7 maggio 2013

Alcune applicazioni KDE utili ma non installate in maniera predefinita

Ultimamente sto usando l'ambiente desktop KDE sul sistema operativo Debian. Trovo che sia abbastanza completo, però anche installando il metapacchetto kde-full alcune applicazioni utili per specifici compiti non sono installate. Di seguito riporto un elenco di applicazioni per l'ambiente desktop KDE non installate in maniera predefinita in Debian. Questo elenco, che potrebbe essere ampliato in futuro, serve soprattutto a me come promemoria, però spero che possa risultare utile anche a qualcun altro.
  • Gestione Bluetooth: bluedevil;
  • fare foto con la webcam: kamerka;
  • client BitTorrent: ktorrent;
  • gestione del touchpad: Synaptiks, il pacchetto Debian si chiama kde-config-touchpad (ne avevo parlato anche qui);
  • integrazione delle applicazioni GTK 2 e GTK 3 con il tema Oxygen: gtk2-engines-oxygen e gtk3-engines-oxygen (per maggiori dettagli vedi qui);
  • registrazione audio dal microfono: audacity (in realtà audacity non è un programma specifico per KDE e fa anche molto altro rispetto alla semplice registrazione, ma non sono a conoscenza di alternative per questo ambiente desktop) kwave (specifico per KDE e molto più semplice di Audacity, ringrazio Ale che l'ha suggerito);
  • acquizione immagini da scanner: skanlite, comunque dovrebbe essere già installato il più potente e completo xsane.
Se avete consigli per altri programmi, lasciate un commento.

mercoledì 24 ottobre 2012

AUCTeX: parsing automatico di tutti i pacchetti LaTeX presenti nel sistema

Fra le miriadi di funzioni disponibili in AUCTeX, il pacchetto per Emacs per la composizione di documenti *TeX, c'è la possibilità di effettuare il parsing automatico di tutti i pacchetti *TeX presenti nel proprio sistema. La comodità di questa funzione è che Emacs in questo modo conoscerà tutti i comandi (e relativa sintassi: numero di opzioni e argomenti) definiti da tutti i pacchetti analizzati. Quando in un sorgente LaTeX caricherete uno dei pacchetti analizzati, in Emacs sarà possibile utilizzare C-c RET o C-c C-m per inserire i comandi conosciuti (e Emacs vi proporrà anche il giusto numero di opzioni e argomenti obbligatori). Purtroppo non sono tutte rose e fiori, all'inizio ho detto un'imprecisione: non va bene per tutti i pacchetti, infatti l'analisi sintattica dà il meglio di sé con pacchetti non troppo complicati e AUCTeX attualmente non è in grado di comprendere la sintassi di LaTeX3. Quindi per questi pacchetti i risultati non saranno quelli attesi.

Si può fare questo (mezzo) prodigio utilizzando i comandi TeX-auto-generate e TeX-auto-generate-global. La prima funzione, eseguibile dentro Emacs con M-x TeX-auto-generate, richiede l'inserimento del file di stile di classe *TeX da analizzare (oppure della cartella in cui cercare ricorsivamente questi file) e della cartella in cui andare a salvare le informazioni (per default il valore della variabile TeX-auto-private che per default dovrebbe valere "~/.emacs.d/auctex/auto").

Il secondo comando, eseguibile dentro Emacs con M-x TeX-auto-generate-global, analizza tutti i file presenti nelle cartelle elencate nella variabile TeX-macro-global e salva le informazioni nella cartella indicata dalla variabile TeX-auto-global (che dovrebbe valere "/var/lib/auctex/emacsXX", con al posto di XX il numero di versione di Emacs). La variabile TeX-macro-global deve contenere il percorso delle cartelle in cui sono presenti, ricorsivamente, i pacchetti *TeX in uso. Quindi una buona idea è quella di inserire nell'elenco, per esempio, la cartella /usr/local/texlive/2012/texmf-dist/tex/ o qualunque sia la cartella contenente i file di stile e di classe. Poiché generalmente la cartella in cui Emacs scriverà le informazioni (/var/lib/auctex/emacsXX in maniera predefinita) è una cartella di sistema, non accessibile in scrittura all'utente corrente se non è amministratore, è necessario eseguire questa funzione dentro una sessione di Emacs avviato con i permessi di amministratore. In alternativa si può semplicemente eseguire da terminale il seguente comando:
sudo emacs -batch -f TeX-auto-generate-global
che esegue il comando, con i permessi di amministratore, senza aprire una nuova finestra di Emacs. Può essere utile eseguire questo comando ogni volta che si aggiorna AUCTeX o che vengono aggiornati i pacchetti della propria distribuzione *TeX. Si noti, però, che l'operazione può richiedere diversi minuti e un elevato consumo della CPU (Emacs deve leggere, interpretare e scrivere alcune migliaia di file), anche se le esecuzioni della funzione successive alla prima (se sono cambiati solo pochi pacchetti e non è stato aggiornato AUCTeX) richiederanno un tempo sensibilmente minore.

sabato 6 ottobre 2012

[Risolto] cannot connect to X server :0

A differenza di GNOME, in KDE non è possibile avviare applicazioni grafiche direttamente con sudo. Infatti, se in KDE si prova a eseguire con sudo un'applicazione grafica da utilizzare con i permessi di amministratore, si potrà ricevere un messaggio di errore di questo tipo
$ sudo kate
QDBusConnection: session D-Bus connection created before QCoreApplication. Application may misbehave.
No protocol specified
kate: cannot connect to X server :0
La soluzione è semplice: basta utilizzare kdesudo (assicurarsi di aver installato il pacchetto omonimo) al posto del solo sudo:
$ kdesudo kate


Aggiornamento (20/06/2013): come detto, bisogna utilizzare kdesudo per eseguire con i permessi di amministratore qualsiasi applicazione grafica, compreso il programma di installazione della distribuzione TeX Live scaricata dal sito http://www.tug.org/texlive/. Provando a eseguire lo script di installazione con sudo al posto di kdesudo si otterrebbe il seguente messaggio d'errore
$ sudo ./install-tl -gui
No protocol specified
perl/Tk unusable, cannot create main window.
Error message from creating MainWindow:
  couldn't connect to display ":0" at /usr/lib/perl5/Tk/MainWindow.pm line 53.
Tk::MainWindow->new() at ./install-tl line 339

Continuing in text mode...
Quindi il comando corretto da utilizzare è invece
$ kdesudo -- ./install-tl -gui
Il doppio trattino dopo kdesudo serve per specificare che è finito l'elenco delle opzioni di kdesudo, il resto dell'argomento deve essere trattato come comando da eseguire, altrimenti -gui verrebbe interpretata come opzione di kdesudo invece che dello script install-tl.

[Risolto] Il volume di sistema in KDE è agganciato a quello di VLC

Non sono riuscito a trovare un'espressione migliore per descrivere il problema: alzando il volume di VLC aumenta anche il volume di sistema, in KDE. Per la precisione, il volume di sistema è sempre maggiore o uguale a quello di VLC. In realtà non è un problema né di KDE (si presenta anche negli altri ambienti desktop) né di VLC (si presenta anche con gli altri programmi, per esempio l'ho riscontrato in Dragon Player), ma di una configurazione predefinita poco felice di PulseAudio. È facile imbattersi in questo problema usando KDE perché questo ambiente desktop usa in maniera predefinita PulseAudio. Nel manuale del demone di configurazione di Pulseaudio (man pulse-daemon.conf) si legge
flat-volumes=  Enable  'flat' volumes, i.e. where possible let the sink
volume equal the maximum of the volumes of the inputs connected to  it.
Takes a boolean argument, defaults to yes.
Per risolvere il problema bisogna modificare il file /etc/pulse/daemon.conf con il proprio editor di testo preferito e con i diritti di amministratore. Per esempio, volendo usare Kwrite per aprire il file si può dare il seguente comando nel terminale
kdesudo kwrite /etc/pulse/daemon.conf
Dopo di ciò si deve impostare la variabile flat-volumes al valore no, per inibire il comportamento descritto nel manuale. Nel file dovrebbe essere già presente la riga
; flat-volumes = yes
In questo caso, togliere il simbolo di commento ; e cambiare il valore della variabile da yes a no. Se la riga precedente non è presente, aggiungete semplicemente da qualche parte la riga
flat-volumes = no
Dopo aver salvato e chiuso il file, per concludere bisogna riavviare Pulseaudio da terminale con il comando
pulseaudio --kill && pulseaudio --start

Ho trovato questa soluzione qui: https://wiki.archlinux.org/index.php/PulseAudio_%28Italiano%29#Il_livello_del_volume_si_alza_ogni_volta_che_una_nuova_applicazione_viene_avviata.

sabato 29 settembre 2012

Massimizzare la finestra di GNU Emacs in KDE

Nell'ambiente desktop KDE, la finestra dell'interfaccia grafica GTK+ di Emacs non viene massimizzata correttamente, come mostrato nella figura a lato. (Per integrare per bene le applicazioni GTK+ in KDE si può consultare questa guida.) Per risolvere questo inconveniente bisogna fare clic sulla barra del titolo di Emacs e aprire AvanzateImpostazioni specifiche per applicazione.... Nella scheda Dimensioni e posizione impostare la voce Rispetta le restrizioni geometriche su Imponi e dopo di che premere Ok. In questo modo viene aggiunta semplicemente una striscia bianca per coprire la regione "scoperta", ma almeno viene eliminato il "fastidio" di vedere parte del desktop dietro una finestra che dovrebbe essere massimizzata.




L'impostazione precedente può essere creata "manualmente" andando in Impostazioni di sistemaRegole delle finestre e nella scheda Regole delle finestre creare una nuova regola facendo clic sul pulsante Nuovo... posto sulla destra. Nella finestra che si aprirà, scrivere una descrizione chiara nel campo omonimo della scheda Corrispondenza delle finestre (la descrizione che si ottiene con la procedura "automatica" descritta sopra è "Impostazioni dell'applicazione di emacs") e nel campo Classe di finestra selezionare Esattamente e aggiungere il valore emacs23 emacs (o l'eventuale numero di versione di Emacs utilizzata).

Ho trovato questo workaround qui: http://forum.kde.org/viewtopic.php?f=111&t=94122.

Attivare il blocco numeri all'avvio di KDE

All'avvio dell'ambiente desktop potrebbe succedere che il tasto blocco numeri (anche noto come blocco numerico o num lock) del tastierino numerico sia disattivato. Per accenderlo automaticamente andare in Impostazioni di sistemaDispositivi di immissione, scheda Tastiera e poi nella scheda Hardware selezionare Acceso nel campo Bloc Num all'avvio di KDE.