Gestione delle lingue con Emacs

Il supporto per le lingue dell’editor più usato in Linux è di primissima qualità. Pochi word-processor possono vantare un tale sistema: conosciamolo.

infomedia
DEV. developing software solutions

--

Anche se gli utenti anglofoni non necessitano dei complessi insiemi di caratteri internazionali che affliggono noi Europei, per non considerare i sistemi che a noi possono sembrare fuori dalla grazia di Dio, come gli arabi e gli orientali, cinesi, giapponesi o coeani, Emacs si è evoluto sostenendo in modo deciso

Ouput e Input

Anche se la localizzazione delle stringhe della propria interfaccia utente non è ancora una realtà (ma secondo le previsioni dello stesso Stallman dovrebbe arrivare presto), Emacs supporta l’editing di una vastissima quantità di formati di documenti nazionalizzati. Al proprio interno Emacs usa una codifica del documento presente nei suoi byte in un formato multibyte. I caratteri ASCII sono codificati in modo invariato ma quelli non compatibili sono trasformati e introdotti nell’intervallo da 0200 a 0377. Quando legge o scrive un file Emacs traduce silenziosamente questi byte nella codifica scelta in input o output.

Per accorgersi delle capacità internazionali di Emacs è possibile usare il comando M-x view-hello-file (o C-h h) che mostra come si scrive Ciao in molti linguaggi (vedi Figura 1). È probabile che alcuni dei font necessari a visualizzare qualche lingua astrusa non siano presenti, in questo caso l’output mostrerà dei quadratini vuoti o dei punti interrogativi.

Ma la visualizzazione di caratteri ostrogoti non è l’unico problema dell’editor, c’è un problema forse anche peggiore: l’input da tastiera. Infatti praticamente mai le tastiere contengono l’intero insieme di tasti per poter inserire ogni singolo carattere, e noi, nel nostro piccolo, sappiamo che rivoluzione ci sia voluta solo per introdurre un nuovo singolo carattere come l’euro nelle nostre tastiere nazionali europee. Cosí Emacs deve sopperire a questa mancanza con un sistema denominato ‘inpu methods’ che permette, tramite l’uso di una combinazione di tasti di immettere qualsiasi carattere dell’insieme nazione in un modo se non immediato almeno non impossibile.

I comandi che riguardano i sistemi di codifica dei caratteri e i metodi di input hanno sempre come prefisso la sequenza “C-x”

Abilitare i caratteri multibyte

In realtà non c’è alcun bisogno di abilitare o disabilitare il sistema interno di uso dei caratteri multibyte: è completamente trasparente per l’utente e supporta ogni lingua nazionale.

Ciò nonostante per compiere qualche particolare editing ed essere sicuro di cosa si sta leggendo o scrivendo senza l’automatica traduzione di Emacs è possibile usare al posto del comando M-x find-file (C-x f) il comando M-x find-file-literally. Per salvare invece un file nel formato multibyte interno (perchè? chissà!) è possibile impostare il coding system come “raw-text” con il comando M-x universal-coding-system-argument (o la sequenza ‘C-x c’).

È possibile castrare Emacs del supporto multibyte lanciandolo con l’opzione ‘ — unibyte’ o definendo la variabile d’ambiente ‘EMACS_UNIBYTE’. Questo però non vale comunque per per i file Lisp che sono sempre letti in multibyte a meno di inserire un commento

;;               -*-unibyte: t;-*-

nella prima linea del file. La linea di stato di Emacs riporta due trattini prima del due punti se il buffer è in multibyte, uno altrimenti.

Lingue

Con i caratteri multibyte attivi Emacs supporta tutte le lingue, non c’è bisogno quindi di selezionare una particolare lingua per poter leggere file codificati nel suo standard di riferimento. Ciò nonostante è importante scegliere un “ambiente di lingua” per definire qualche funzione specifica ed utile. In realtà quindi vengono semplicemente scelti alcuni default e alcuni script opportuni, il resto non cambia.

L’ambiente linguistico controlla il sistema di codifica per il riconoscimento del testo letto dai file, ma anche dalla posta o dalle news e dagli altri modi con cui Emacs può accedere alle informazioni. Controlla inoltra il metodo di input che decide come va usata la tastiera.

Per selezionare un ambiente di linguaggio è possibile usare il comando M-x set-language-environment e gli effetti sono globali. Sono supportati una trentina di ceppi linguistici o linguaggi specifici, Quello che ci interessa è il Latin-1 oppure il Latin-9 se vogliamo usare il carattere dell’Euro.

L’uso di questa scelta impone anche l’uso di un adeguato font-set per permettere di visualizzare correttamente gli elementi del linguaggio, per le lingue europee non ci sono problemi con l’installazione standard ma per le altre è necessario installare anche il pacchetto GNU Intlfonts.

Il file “Hello” visualizzato da Emacs serve a dimostrare le capacità di uso del programma nel contesto delle lingue internazionali. Anche se questo esempio può sembrare banale non sono molti gli editor o i word processor che possono raggiungere questo risultato.

Anche se gli utenti anglofoni non necessitano dei complessi insiemi di caratteri internazionali che affliggono noi Europei, per non considerare i sistemi che a noi possono sembrare fuori dalla grazia di Dio, come gli arabi e gli orientali, cinesi, giapponesi o coeani, Emacs si è evoluto sostenendo in modo deciso l’internazionalizzazione.

Locali

Su alcuni sistemi operativi su cui gira Emacs è possibile definire una o più variabili di ambiente che riguardano le impostazioni nazionali o locali. Le variabili sono `LC_ALL’, `LC_CTYPE’, or `LANG’. Quando parte, Emacs tenta di considerare queste variabili cercandole nelle proprie variabili ‘locale-charset-language-names’ e ‘locale-language-names’, in quest’ordine) per selezionare l’ambiente nazionale adeguato. Inoltre aggiusta la tavola dei caratteri visualizzati, il sistema di codifica del terminale, il sistema di codifica locale, ed inoltre il modo con cui Emacs decodifica i caratteri non-ASCII spediti dalla tastiere, insomma tutto quello che serve a gestire il testo ‘nazionale’.

È possibile, dopo aver modificato una di queste variabili, usare la funzione ‘set-locale-environment’ che riadatterà Emacs a queste nuove variabili, oppure usare il comando ‘set-language-environment’ per definirlo direttamente all’interno del programma.

Per vedere le informazioni relative al proprio ambiente linguistico è possibile usare il comando ‘describe-language-environment’ (C-h L ), che mostrerà gli insiemi di caratteri, il sistema di codifica, i metodi di input dell’ambiente scelto e anche un testo di esempio illustrativo.

Metodi di Input

Un ‘input methor’ è un tipo di conversione di caratteri progettata esplicitamente per l’inserimento del testo. In Emacs ogni lingua ha il suo proprio metodo di input, a volte un metodo può essere condiviso da più lingue e a volte, al contrario, una lingua può avere diversi metodi di input.

Il tipo più semplice è quello in cui i caratteri ASCII sono traformati in caratteri di un altro alfabeto, è il caso per esempio della lingua russa o greca.

Una tecnica di composizione molto potente è quella che prevede la conversione dei caratteri in una unica lettera, ad esempio è quello che accade con le lettere accentate o con i caratteri sillabici (ad esempio la sharp s tedesca o l’ae latino).

Lingue come il cinese e il giapponese richiedono un metodo più complesso. In questo caso dopo aver introdotto lo spelling fonetico di una parola si dovrà scegliere tra i vari caratteri cinesi che la rappresentano quale è quella che ha il significato adatto.

A volte è utile disabilitare il metodo di input attivo in modo da ottenere esattamente quello che si scrive. Un metodo è usare il modo stesso, ad esempio nel modo italiano suffisso, che permetterebbe l’inserimento delle lettere accentate scrivendo prima la lettera e dopo il tipo di accento (ad es. e` verrebbe trasformato è) è possibile raddoppiare il suffisso per ottenere il risultato voluto (ad es. e otterrebbe e). L’altro metodo è quello di usare il comando ‘toggle-input-method’ (o più convenientemente l’abbreviazione C-\) per passare dal metodo di input specifico a quello generico senza modifiche (in questo caso l’esempio precedente sarebbe risolto con “e C-\ ‘ C-\”, non molto comodo ma efficace soprattutto nell’indicazione delle ricerche incrementali dove la composizione può avere effetti indesiderati).

I comandi specifici per la gestione degli input metodi sono il già visto “C-\” che abilita o disabilita l’uso di un input method, “C-x C-\ METODO “ che permette la selezione di un nuovo metodo di input, “C-h I METODO “ e “C-h C-\ METODO “ che descrivono un metodo di input, e “M-x list-input-methods” che mostra una lista di tutti i metodi supportati.

Sistemi di codifica

Emacs non usa i normali metodi di codifica che si trovano comunemente per rappresentare i testi, preferendo invece un proprio sistema interno, univoco, che permette la rappresentazione di qualsiasi tipo di sistema di codifica.

I sistemi di codifica hanno ciascuno un nome, come ‘iso’, ‘no-conversion’, ‘raw-text’, ‘emacs-mule’. Questi ultimi tre sono sistemi particolari che di fatto restituiscono l’esatta rappresentazione dell’informazione cosí come trattata da Emacs.

Il sistema dei ‘codepages’, che è una intera classe speciale di sistemi di codifica, è stata progettata per gestire i testi codificati da MS-Windows e MS-DOS. Per aprire un file MS-DOS codificato con il codepage 850, la sequenza dei comandi Emacs è:

C-x  c cp850  C-x C-f FILENAME

Per avere informazioni sulle differenti convenzioni utilizzate per separare le linee di un file, i ritorni a capo o l’avanzamento di riga è possibile usare i comandi ‘C-h C’ o ‘M-x list-coding-systems’. C’è da notare che ogni sistema di codifica ha più varianti (omesse nell’elenco), identificate da un suffisso al proprio nome come “…-unix’, che non fa alcuna conversione di fine riga assumento l’uso del solo avanzamento di riga (newline); “…-dos”, che fa una conversione in modo da avere sia il ritorno carrello (carriage-return) che l’avanzamento di riga a fine linea; e infine “…-mac” che usa il solo ritorno carrello a fine riga.

La differenza tra la codifica ‘raw-text’ e quella ‘no-conversion’ è che mentre ambedue non fanno modifica di sorta ai dati letti, solo la prima possiede le tre varianti (unix, dos e mac) e fa l’adeguamento della codifica del fine linea, la seconda invece legge il testo esattamente com’è ed è utile, ad esempio, per leggere dati binari. Quest’ultima viene usata attraverso il comando “M-x find-file-literally” che legge un file senza alcun tipo di modifica.

La codifica ‘emacs-mule’, invece, identifica i caratteri estesi usati da Emacs e li interpreta adeguatamente e ha, inoltre, le tre varianti che gestiscono le differenti convenzioni sul fine riga.

Insiemi di caratteri

Un font definisce la forma di un alfabeto in X. Per l’intero insieme di alfabeti differenti che Emacs supporta è necessaria una collezione di molti font, insieme che viene comunemente indicato come fontset.

Ogni fontset ha un nome. I font sono però gestiti direttamente dal server grafico X mentre i fontset sono definiti all’interno di Emacs. Dovunque è possibile usare un nome di font (di X), in Emacs è anche possibile usare un fontset. Ovviamente qualora un font richiamato all’interno di un fontset non esista nell’elenco di quelli disponibili in X, Emacs si occuperà di sostituirlo con una serie di quadratini. Quindi se, come mostrato nella Figura 1.

Due fontset sono creati automaticamente da Emacs, lo “standard fontset” e lo “startup fontset”. Il fontset standard è il più completo ma non è quello usato automaticamente. È possibile usarlo richiamando Emacs con l’opzione ‘-fn’ nel comando di partenza, come:

emacs -fn fontset-standard

Il progetto di introduzione dell’editing multilinguistico è stato introdotto in Emacs solo abbastanza recentemente, nel Settembre 1997, ma lo sforzo per la sua realizzazione è iniziato molto più indietro nel tempo. Già nel 1987, infatti, nacque la prima versione di Nemacs, un fork di Emacs realizzato proprio per permettere l’editing di testi di una pluralità di lingue. L’ultima versione di Nemacs fu prodotta nel Giugno 1990 (era la 3.3.2) dopo di che Stallman si dichiarò disponibile ad integrare il progetto all’interno dell’editor.

Nacque cosí il progetto MULE, che rilasciò la sua prima versione nell’Agosto 1993 in concomitanza con la versione 18.51 di Emacs. L’ultima versione a sé stante di Mule è datata Luglio 1995, dalla versione 20.1 di Emacs rilasciata nel Settembre 1997 appunto, Mule è completamente integrato nella base di codice di Emacs. Durante i quasi dieci anni di lavorazione iniziale di Nemacs e di MULE gli autori del programma si sono basati su una vecchissima versione di Emacs producendo abbastanza velocemente un editor utilizzabile.

Questo dimostra l’importanza del ‘fork’ (ovvero di una biforcazione nell’evoluzione del codice sorgente) di un programma libero. Gli autori di Emacs non hanno dovuto introdurre volta per volta le modifiche, spesso sperimentali, necessarie a Mule, e d’altro canto gli autori di Mule non hanno dovuto sempre evolvere la struttura di base dell’Emacs sottostante. Quando il progetto si è stabilizzato è stato possibile introdurre in Emacs solo quanto effettivamente necessario e ormai già ben definito e, alla fine abbandonare completamente il codice ‘forkato’. Nessun programma proprietario potrà mai garantire questa semplicità nell’operare con le innovazioni.

* Mule (MULti-Lingual Enhancement for GNU Emacs) 
* Localizzazione e Internazionalizzazione
* Ambienti Linguistici
* Metodi di Input
* Sistemi di codifica, salvataggio e riconoscimento
* Insiemi di font: standard-fontset, startup-fontset
emacs -fn "*courier-medium-r-normal--14-140-*-iso8859-1"
xfontsel

--

--