giovedì 24 dicembre 2009

Aprire con Emacs un file protetto

Se avete l'editor di testo Emacs già aperto e avete necessità di modificare un file di testo protetto (per esempio uno dei file di configurazione presenti nel file system e di proprietà dell'utente root), non c'è bisogno di avviare una nuova sessione Emacs, magari da terminale con il comando
gksudo emacs /percorso/del/file/protetto
Esiste, infatti, una estensione chiamata Tramp (inclusa di default nell'installazione delle ultime versioni di Emacs) che permette di editare file remoti ma anche file appartenenti a un altro utente. Per modificare un file protetto è sufficiente usare la combinazione di tasti C-x C-f (oppure per chi usa l'interfaccia grafica andare in File → Open file, che è la stessa cosa) e scrivere
/sudo::/percorso/del/file/protetto
Quindi, se per esempio vogliamo aggiungere un nuovo repository nel file /etc/apt/sources.list dovremo scrivere
/sudo::/etc/apt/sources.list
Verrà ovviamente richiesta di inserire la password nella echo-area. Se {volete,avete bisogno di,preferite} usare su al posto di sudo, dovete usare la sintassi
/su::/percorso/del/file/protetto


Come accennato prima, Tramp permette anche di modificare file in remoto per esempio attraverso telnet o ssh. La procedura è sempre la stessa: dopo aver aperto un nuovo file con C-x C-f (oppure File → Open file) scrivete
/telnet:/percorso/del/file/remoto
oppure
/ssh:/percorso/del/file/remoto
Per maggiori dettagli su questa estensione potete consultare il manuale (in inglese).

sabato 5 dicembre 2009

Autocompletamento in Emacs

Nota: Nel post Autocompletamento in Emacs (2) spiego come installare la nuova versione di questa estensione, che offre maggiori funzionalità rispetto a questa.

In Emacs ("l'editor in tempo reale, estensibile, personalizzabile, auto-documentante e visuale") è disponibile una funzione di autocompletamento con la combinazione M-/ (ricordo che il tasto M, abbreviazione di Meta, corrisponde in genere al tasto Alt oppure Esc). Questa combinazione, però, è abbastanza scomoda da usare dal momento che in realtà bisogna premere 3 tasti ogni volta (ALT + SHIFT + 7, a quanto pare lo slash dell'eventuale tastierino numerico non vale), almeno sulle tastiere italiane, e quindi velocizza ben poco la scrittura di un testo o di un codice. Essendo Emacs un editor di testo estensibile, qualcuno ha ovviamente provveduto a creare un'estensione che permettesse di aumentare notevolmente l'utilità dell'autocompletamento. Esistono almeno 2 o 3 estensioni che fanno al nostro caso, io ne ho provata una in particolare, si chiama Auto Complete.

Come è possibile leggere dal file README visualizzato nella pagina principale del progetto, per installare questa estensione è sufficiente eseguire questi comandi in un terminale (la versione del programma probabilmente cambierà rispetto a quella presente in questo post, fate sempre riferimento al file README presente su quel sito):
git clone git://github.com/m2ym/auto-complete.git
cd auto-complete
git checkout v1.0
emacs -L . -batch -f batch-byte-compile *.el
cp *.el *.elc ~/.emacs.d/

Per seguire questa strada è quindi necessario aver installato nel proprio sistema Git, il sistema software di controllo versione distribuito realizzato da Linus Torvalds in persona. Il nome del pacchetto da installare in Ubuntu per ottenere questo programma (se non è già presente), però, non è git, come ci si potrebbe (e dovrebbe) aspettare ma git-core, perché git si riferisce a un altro programma. Quindi è sufficiente installare da Synaptic il pacchetto git-core, oppure digitare nel terminale il comando
sudo apt-get install git-core
Dopo di ciò sarà possibile eseguire i comandi sopra elencati per poter installare l'estensione Auto Complete. Poi, come spiegato nel file auto-complete.el, bisogna aggiungere al file di configurazione ~/.emacs (ricordo che la tilde ~ è un'abbreviazione per il percorso della cartella home dell'utente corrente e che file e cartelle che hanno il nome che inizia con il punto sono nascosti) queste righe:
(require 'auto-complete)
(require 'auto-complete-config)
(global-auto-complete-mode t)

Queste servono per caricare i file necessari e attivare automaticamente la modalità global-auto-complete.

Potrebbe presentarsi un problema nel caso in cui la cartella ~/.emacs.d non sia presente nella variabile load-path di Emacs. Infatti con l'ultimo comando (cp *.el *.elc ~/.emacs.d/) avete copiato tutti i file con estensione .el e .elc nella cartella ~/.emacs.d, ma in questo caso Emacs non sarebbe in grado di caricare questi file al suo avvio e comparirebbe un messaggio simile a questo:
Warning (initialization): An error occurred while loading `/home/USERN_NAME/.emacs':

File error: Cannot open load file, auto-complete

To ensure normal operation, you should investigate and remove the
cause of the error in your initialization file. Start Emacs with
the `--debug-init' option to view a complete error backtrace.

Per rimediare a ciò è sufficiente aggiungere la cartella in questione alla variabile load-path inserendo questa riga nel file ~/.emacs (prima delle righe segnalate in precedenza, vedi qui):
(add-to-list 'load-path "~/.emacs.d")
A questo punto l'estensione sarà pronta per essere usata.

La procedura di aggiunta di una cartella alla variabile load-path potrebbe essere necessaria anche nel caso in cui si volessero aggiungere altre estensioni presenti in altre cartelle non "caricate" da Emacs. È comunque consigliabile mettere tutte le estensioni personalizzate in un'unica cartella, che può essere tranquillamente diversa da ~/.emacs.d (in questo caso non dimenticatevi di copiare i file dell'estensione Auto Complete nella cartella opportuna!).