# Emacs

Emacs è un editor di testo libero estremamente versatile molto popolare fra i programmatori. È stato sviluppato originariamente da Richard Stallman a partire dal settembre 1984, come insieme di Editor MACroS per l'editor TECO.
Emacs è parte del progetto GNU ed è sotto sviluppo attivo. Molti, anche se non tutti, gli sviluppatori sono affiliati con la Free Software Foundation (FSF). È un software multipiattaforma, le cui versioni più popolari sono due: GNU Emacs (sempre scritto da Stallman) e il suo parente stretto XEmacs. La parola in minuscolo emacs può essere usata per identificare quella classe di editor dal funzionamento simile all'Emacs originale.
La parola Emacs (con la maiuscola) è spesso usata come sinonimo di GNU Emacs.

## Storia

Emacs fu creato nel laboratorio di intelligenza artificiale (AI) del MIT. Prima della sua introduzione, l'editor comunemente usato sul sistema operativo ITS (sistema operativo dei computer PDP-6 e PDP-10 presenti nel laboratorio) era TECO. A differenza degli editor di testo moderni, TECO separava il compito della battitura del testo dalla sua modifica, così che modificare un documento richiedeva la scrittura di una serie di istruzioni per il linguaggio interno di TECO.
Questo funzionamento è simile al programma ed, tuttora utilizzato.
Carl Mikkelsen, uno degli hacker al laboratorio AI del MIT, aggiunse a TECO una modalità di modifica-visualizzazione, che permise di aggiornare la schermata presentata ad ogni pressione di un tasto da parte dell'utente. Questa modalità molto più intuitiva, usata dalla maggior parte degli editor di testo moderni, fu introdotta con l'editor "E" sviluppato ai laboratori di intelligenza artificiale di Stanford. Nel 1974, Richard Stallman (un altro hacker) aggiunse una funzionalità macro alla modalità modifica-visualizzazione di TECO. Questo permise all'utente di definire sequenze di tasti associate all'esecuzione di programmi TECO, in modo da completare determinati compiti come leggere o scrivere dei file.
Gli utenti al laboratorio di AI accumularono in breve tempo una grande collezione di macro personalizzate. Nel 1976, Guy Steele cercò di unificare questi insiemi divergenti di macro. Il suo progetto fu completato da Stallman, che scrisse anche funzionalità per l'estensione e l'auto-documentazione. Il programma risultante fu chiamato EMACS. Pur infatti essendo costruito sopra TECO, il suo funzionamento era così differente da doversi considerare un editor di testo a sé stante.
"EMACS" è la contrazione di "Editor MACroS". Secondo Stallman, è stato utilizzato il nome Emacs "perché non era usata al tempo come un'abbreviazione su ITS". È stato fatto notare che "Emack and Bolio's" era il nome di un negozio di gelati molto popolare a Boston, situato a pochi passi dal MIT. Il programma di formattazione testi usato su ITS era chiamato BOLIO.
EMACS divenne presto l'editor standard su ITS. Fu anche portato da ITS ai sistemi operativi Tenex e TOPS-20 da Stallman e Michael McMahon.
Svariati editor simili ad Emacs furono sviluppati negli anni seguenti, inclusi EINE (EINE Is Not EMACS) e ZWEI (ZWEI Was EINE Initially) di Michael McMahon e Daniel Weinreb. Nel 1978, Bernard Greenberg scrisse Emacs per Multics al Honeywell's Information Systems Lab di Cambridge. Questo editor fu sviluppato in MacLisp, un dialetto del linguaggio di programmazione Lisp (linguaggio funzionale molto in voga, soprattutto in quegli anni, proprio nell'ambito dell'intelligenza artificiale). Estensioni al programma create dagli utenti venivano scritte sempre in Lisp. La scelta di usare Lisp diede maggiore estendibilità, scelta poi imitata dalla maggior parte degli emacs successivi.
Gosling Emacs, il primo editor simile ad Emacs funzionante su Unix, fu scritto da James Gosling nel 1981. Questo era scritto in C e utilizzava una versione ridotta di Lisp, conosciuta come Mocklisp, come linguaggio di estensione.
Nel 1984, Stallman iniziò a scrivere una nuova implementazione di emacs, GNU Emacs, che divenne il primo programma del nascente progetto GNU. GNU Emacs fu scritto anch'esso in C e usava Emacs Lisp per le sue estensioni. La prima versione di GNU Emacs distribuita largamente fu la revisione 15.34, apparsa nel 1985. Come Gosling Emacs, GNU Emacs girava su Unix; però, GNU Emacs aveva molte più funzionalità, in particolare un'implementazione Lisp completa come linguaggio di estensione. Come risultato, ben presto rimpiazzò Gosling Emacs come editor Emacs de facto su Unix.
Iniziando nel 1991, Lucid Emacs fu sviluppato da Jamie Zawinski e altri presso Lucid Inc., basandosi su una versione alpha di GNU Emacs 19. Presto i due codici base diversero, e i separati gruppi di sviluppo smisero di tentare di reintegrarli in un singolo programma. Fino alla pubblicazione di Emacs 21.1 (1999), lo sviluppo di Emacs era relativamente chiuso. Da allora il progetto ha adottato una mailing list di sviluppo pubblica e accesso CVS anonimo. Come in tutti i progetti GNU, è prassi nello sviluppo di Emacs accettare contributi di codice significativi solo se il contributore assegna il copyright per il codice alla FSF, sebbene una eccezione sia stata fatta per il codice di MULE (MULtilingual Extension) in quanto il detentore del copyright (il governo giapponese) non aveva permesso questo assegnamento. Tutto questo non si applica ai bug report o a contributi di codice minimi, dove per contributi minimi si intendono 10 righe di codice o meno. Questo sistema esiste per facilitare l'applicazione del copyleft.

## Descrizione

Il manuale di GNU Emacs descrive questo ambiente come "the extensible, customizable, self-documenting, real-time display editor." (l'editor in tempo reale, estensibile, personalizzabile, auto-documentante e visuale.)

### Interfaccia utente

Emacs memorizza il testo in oggetti chiamati buffer. L'utente può creare nuovi buffer e chiudere quelli non più usati, più buffer possono esistere allo stesso tempo. La maggior parte dei buffer contengono testo caricato da un file di testo per essere editato dall'utente. Allo stesso tempo, i buffer possono essere usati per altri scopi; per esempio, l'utente potrebbe creare buffer vuoti per memorizzare testo temporaneamente.
Ogni schermata di Emacs (che può essere una singola 'finestra' in un sistema a finestre, o uno schermo intero in un terminale) può mostrare uno o più buffer allo stesso tempo. Se più di un buffer è mostrato, l'area della schermata viene divisa in più sezioni (alle quali Emacs si riferisce, creando confusione, come windows ovvero finestre). In un sistema a finestre, più finestre di Emacs possono essere create (alle quali Emacs si riferisce con il termine frames).
L'utente invoca comandi per la modifica del testo premendo sequenze di tasti. In aggiunta agli usuali comandi per inserire e cancellare il testo, Emacs fornisce un insieme di comandi più esotici, come muovere il punto di modifica alla frase seguente, aprire tutti i file in una directory, ed eseguire operazioni di ricerca e sostituzione. La maggior parte di questi comandi può essere attivata con una combinazione di tasti. Versioni più recenti di Emacs forniscono menù grafici per i comandi più comuni. (La maggior parte dei comandi, anche il più semplice come a per l'inserimento del carattere a, sono in realtà chiamate di funzioni Emacs Lisp, descritte sotto).
Emacs supporta molte codifiche di caratteri, incluso UTF-8. Una versione con pieno supporto Unicode è in fase di sviluppo. Per gli utenti con handicap visivi esiste un sottosistema chiamato Emacspeak che può essere caricato. Permette all'editor di essere usato con il solo riscontro sonoro. Emacs ha poi una sua politica di assegnazione dei tasti alle funzioni che si evolve dal lontano 1976 e che può essere descritta in questo modo:
* I comandi sono associati a sequenze di tasti il più possibile mnemoniche
* Generalmente se un comando richiamato con Control + lettera agisce a livello di singola lettera, allora il corrispondente Meta + lettera agisce a livello di parola e Control + Meta + lettera (se definito) agisce a livello di strutture sintattiche.
* I comandi più frequenti si attivano in modo più rapido di quelli di uso più rado
** I più comuni sono associati a Control + lettera, Meta + lettera e Control + Meta + lettera. Esempi sono lo spostamento nel testo, cancellazione, copiatura di aree di testo, trasposizione di lettere o parole...
** I comandi di uso generale di uso meno frequente sono attivati attraverso il prefisso Control + x (ad esempio caricare un file in un buffer o salvare il contenuto di un buffer in un file)
** I comandi tipici di un certo tipo di file sono attivati col prefisso Control + c (compilazione di un sorgente, invio di un messaggio di posta elettronica)
** altri comandi sono invocati col loro nome per esteso dando il comando Meta + x (ad esempio set-background-color, per impostare il colore dello sfondo laddove i colori siano supportati).
(Nota: Meta era un tasto presente sulle tastiere delle macchine disponibili nei MIT AI Labs ed ha uso simile allo Shift ed al Control. Sui PC attuali viene usualmente mappato sul tasto Alt o sui tasti bandierina. In alternativa all'uso del tasto Meta-lettera si può usare il tasto ESC seguito dal tasto lettera ).
Per facilitare la vita ai nuovi utenti è comunque presente un pacchetto detto cua-mode che attiva delle assegnazioni di tasti conformi allo standard CUA (tipico delle GUI di Motif/Windows/Mac), ma quello che prevede lo standard CUA è solo un sottoinsieme di ciò che Emacs rende disponibile.

### Personalizzazione

Il codice sorgente di basso livello di Emacs è scritto nel linguaggio di programmazione C. Componenti scritti in questo linguaggio sono il sistema grafico e l'interprete per Emacs Lisp (un dialetto del citato linguaggio LISP) oltre a tutte quelle parti che risultano critiche per l'efficienza. La maggior parte del codice per la modifica del testo è scritta in Emacs Lisp. Quando Emacs è in esecuzione, l'interprete carica e valuta (esegue) questo codice Lisp.
L'utente può estendere e personalizzare il codice Lisp da Emacs stesso. Emacs fornisce numerosi strumenti che permettono questo, inclusi comandi per leggere la documentazione di funzioni e variabili già caricate (questo riflette la definizione di auto-documentante). Attraverso la valutazione di codice Lisp fornito dall'utente, il comportamento di Emacs può essere modificato "al volo", senza che ci sia bisogno di ricompilare il programma o rilanciare l'editor. Lisp è una buona scelta come linguaggio per questo scopo, perché permette di trattare le funzioni come dati (ovvero, è un linguaggio funzionale).
Il risultato di tutto questo è che è molto facile aggiungere funzionalità personalizzate a Emacs. Emacs include numerose estensioni standard, come Emacs/W3 (un browser web), Gnus (uno strumento per leggere E-Mail e discussioni Usenet), un'implementazione del gioco Tetris e Doctor, un'implementazione di ELIZA che simula una psicoterapia Rogeriana. In aggiunta, Emacs può essere usato come IDE, permettendo ai programmatori di modificare, compilare, e fare il debug del proprio codice attraverso una singola interfaccia.
Punto a sfavore del design di Emacs è il carico di performance aggiunto causato dal caricare ed interpretare il codice Lisp. Due acronimi scherzosi di EMACS sono Eight Megabytes And Constantly Swapping (otto Megabyte e swapping costante), e Emacs Makes A Computer Slow (Emacs rende un computer lento). I computer moderni hanno generalmente memoria e processore adeguati in confronto ai sistemi sui quali Emacs fu implementato, tanto che questi motteggi non hanno più rilevanza. Nonostante questo, è un punto frequentemente sollevato dai detrattori di Emacs durante le cosiddette editor wars (guerre fra editor).
Ci sono altri due metodi per personalizzare Emacs, anche se nessuno così flessibile come scrivere codice Emacs Lisp. Uno è la possibilità di usare comandi per registrare macro, cioè comandi composti da sequenze di tasti. L'altro è usare il sistema "Customize", incluso in versioni recenti di Emacs, che permette agli utenti di personalizzare le variabili più comuni usando un'interfaccia grafica.

### Funzionamento interno ("buffer gap")

Il contenuto dei buffer è memorizzato come una sequenza contigua di caratteri separata da un divisore (gap), dove il punto di modifica è posizionato. Le modifiche sono fatte al buffer muovendo il divisore oppure alterando il carattere seguente al divisore. Questo schema permette alle operazioni di modifica di essere molto efficienti, visto che non viene modificata molta memoria. Un altro modo di memorizzare documenti è quello di memorizzare ogni linea del documento in un piccolo buffer.

## Distribuzione

Emacs è software libero, distribuito sotto i termini della GNU GPL.
Il codice sorgente e i binari sono disponibili via FTP dal sito web del progetto GNU (vedi sotto). Sono anche ampiamente disponibili da altri siti Internet. Svariati vendors di Unix (sia liberi che proprietari) forniscono frequentemente Emacs insieme al sistema operativo.

## La guerra degli editor

Esiste una (scherzosa) "guerra di religione" tra chi afferma che il miglior editor di testi sia Emacs, e invece chi afferma sia vi.
Tra l'altro, Emacs è in grado di emulare autonomamente vi, mentre per l'implementazione di emacs effettuata partendo da vi è necessario utilizzare script in shell.
Esiste anche una (ancor più scherzosa) "chiesa di Emacs", dove principalmente (ci) si prende in giro per la passione per questo potente strumento di lavoro.
La cosa ha portato a scherzosi scritti teologici come questo post in alt.religion.emacs in cui Juliusz Chroboczek risponde a Per Abrahamsen (testo originale):
   PA: "D'altra parte si può argomentare che Emacs sia un sistema operativo, non si può andare molto più vicini di così".
   JC: "Sebbene io sia d'accordo con te sull'idea fondamentale, temo che questa frase sminuisca Il Solo Editor, e trascuri uno dei suoi misteri fondamentali; se tutti noi non conoscessimo perfettamente la tua perfetta ortodossia, si leverebbero accuse di blasfemia.
   Emacs (che il Suo nome sia onorato per sempre) non è solo un sistema operativo, è un sistema operativo e un linguaggio di programmazione (Il Solo Linguaggio di Programmazione - vedi alt.religion.lisp) e un insieme di editor, dove il linguaggio di programmazione è la personificazione del collegamento tra gli editor ed il sistema operativo. Che Emacs sia Uno in Tre o Tre in Uno rimane una questione teologica tuttora aperta".