GNU Emacs powerful developing tool
Transcript
GNU Emacs powerful developing tool
GNU/Emacs – powerful developing tool Disclaimer: cio' che vedrete in questo Geek Evening e' il frutto dei tentativi notturni di scrivere del codice leggibile da parte di un NON programmatore... Don't try this at /home ! (...if you're not sure about it) 1 GNU/Emacs – powerful developing tool Premesse: in questo Geek Evening verra' utilizzata la terminologia standard di Emacs, quindi faremo riferimento ai frame intendendo quelle che nel linguaggio comune vengono chiamate finestre e viceversa. Nel corso del G.E. verra' effettuata soltanto una panoramica dei tool per lo sviluppo piu' famosi per GNU Emacs, non verranno affrontati nel dettaglio in quanto ognuno di essi richiederebbe un geek evening apposito. Faremo uso di GNU Emacs 22.3.1, quindi quanto indicato in queste slides potrebbe differire leggermente in caso di versioni differenti. Lo scopo come detto e' quello di presentare i tool piu' interessanti quindi per approfondimenti vi consiglio di visitare i loro siti ufficiali, o le loro pagine su emacswiki per maggiori informazioni. Premessa necessaria ed equivalente alla seguente dicitura: (much0mode off) 2 Iswitchb Iswitchb e' un'alternativa alla piu' famosa funzione switchtobuffer (chiamata di default da Cx b per cambiare buffer). Con iswitchb possiamo digitare il nome del buffer usufruendo del completamento. Man mano che digitiamo il nome del buffer che ci interessa, si restringe il campo delle possibili alternative. Con iswichb non e' necessario scrivere il nome del buffer dall'inizio. Esempio: se volessimo switchare al buffer *Message*, potremmo semplicemente digitare age e vedremmo *Message* fra le alternative proposte nel minibuffer. Per cominciare ad utilizzare la funzione iswitchbuffer, possiamo inserire nel nostro .emacs la seguente stringa: (iswitchbmode 1) 3 Ido-mode Spesso chi vuole le features proposte da iswitchb desidera anche utilizzarle per l'apertura di nuovi files... Quello di cui abbiamo bisogno e' quindi IdoMode, non piu' Iswitchb. Ecco come farlo caricare in automatico da Emacs: (require 'idomode) (idomode t) Adesso proviamo ad aprire un file (Cx f). Notato nulla? Adesso per scegliere il file desiderato non abbiamo solo a disposizione il semplice tabcompletamento, ma addirittura possiamo usare Cs e Cr per ciclare fra le alternative. Lo stesso vale per il switching fra i buffer (Cx b). Se vogliamo disabilitare temporaneamente ido basta un Cf o un Cb. Inizialmente potreste trovarvi male, soprattutto se provate ad avviare dired in questo modo... Bhe, basta un Cd per aprire la cartella corrente in dired. Per chi poi vuole di piu' rimando a Icycle. 4 Numeri di riga e colonna Per far si che Emacs visualizzi automaticamente il numero di riga e di colonna, basta aggiungere nel file di configurazione (~/.emacs) le seguenti righe: (setq linenumbermode t) (setq columnnumbermode t) In realta' la prima riga non e' necessaria in quanto abilitata di default. I numeri di riga e di colonna vengono rappresentati nella modeline. 5 Numeri di riga e colonna Linenumber ha una limitazione, cioe' mostra il numero di linea soltanto se la dimensione del buffer in byte non supera il valore contenuto nella variabile linenumberdisplaylimit. In realta' non credo sia un grosso problema... 6 Numeri di riga e colonna Tuttavia ognuno di noi credo che trovi piu' comodo avere ogni riga numerata a lato... Per questo nel mio emacs carico all'avvio linum, una piccola estensione scaricabile da EmacsWiki... Ecco poi come farla caricare ad Emacs: (loadfile "/path/to/linum.el") Non voglio che in ogni majormode venga visualizzato il numero di riga, mi puo' interessare ad esempio quando edito listati ruby e quindi: (addhook 'findfilehook 'linummode) Se pero' volessi vedere in ogni file che apro, qualunque sia il major mode, il numero di riga, allora aggiungerei questo secondo hook: (addhook 'rubymodehook 'linummode) Alternative a linum : linenum, setnu 7 Numeri di riga e colonna Per saltare ad una particolare riga: Mx gotoline. Questo comando e' bindato alla combinazione Mg (come si puo' vedere con un Ch b) ed e' gia' presente in GNU Emacs. 8 Syntax Highlighting fontlockmode e' il modo standard utilizzato da Emacs per il syntax highlighting nel codice. Anche in questo caso ricorriamo agli hook per fare in modo che venga abilitato solo in particolari major mode: (addhook 'cmodehook 'turnonfontlock) Invece per abilitare il syntax highlighting per ogni buffer, indipendentemente dal major mode: (setq globalfontmodelock t) 9 Syntax Highlighting Il livello di decorazione che fontlock utilizzera' e' specificato nella variabile fontlockmaximumdecoration Come al solito vi incoraggio a dare un Ch v fontlockmaximum decoration <Invio> per leggere la documentazione relativa a quella variabile. 10 Syntax Highlighting Da fontlock potremmo pero' desiderare di piu', ad esempio potremmo voler evidenziare anche altre parole chiave che invece vengono ignorate. Come fare? (fontlockaddkeywords 'emacslispmode '(("foo" . fontlockkeywordface))) 11 Syntax check... Abbiamo parlato di evidenziare la sintassi, ma perche' non utilizzare anche un tool che la controlli per segnalarci eventuali errori? Questo tool e' flymake! Si tratta di un minormode che lancia al volo dei controlli sulla sintassi utilizzando gli strumenti propri di ogni linguaggio. Ad esempio per il syntaxcheck dei file c/cpp viene utilizzato gcc, per perl viene richiamato l'interprete perl ecc... Flymake evidenzia i warning (in blu) e gli errori (in rosso). 12 Syntax check... L'idea che sta dietro flymake e' quella di creare un syntaxchecker universale, quindi chiunque puo' contribuire seguendo i consigli dello sviluppatore a far si che dei determinati linguaggi/tool siano supportati. Ecco dunque con quali linguaggi e' attualmente possibile usare flymake: C, C++, PHP, Ruby, Fortran, JavaScript, ActionScript 3, Haskell, Erlang, Lua, Bash, Java, Perl. 13 Syntax check... Come attivare lo spell check per il rubymode ? Innanzitutto ci servono alcune righe di codice... Le troviamo su: http://www.emacswiki.org/cgibin/wiki/FlymakeRuby Magari anziche' inserirle nel .emacs mettiamole in un apposito file flymakeruby.el e richiamiamo questo dal .emacs. In questo modo evitiamo di sporcarlo... Leggendo quel codice e' facile intuire che ogni volta che apriremo un file .rb verra' automaticamente performato lo spell check, quindi non saranno necessarie altre righe... Vi ricordo che e' buona norma leggere cio' che installiamo... :) 14 Paren Match Highlighting Quando si parla di “paren” si intendono tutti i delimitatori classici, parentesi tonde, quadre, graffe, virgolette, apici, parentesi angolari... Mx checkparen lo utilizziamo per controllare se nel codice scritto fino a questo momento ci sono parentesi non accoppiate. Con il parenmatching abilitato, ogni qualvolta chiudiamo una parentesi, il cursore si sposta per pochi istanti al punto in cui l'avevamo aperta. Se il punto di apertura non e' nella parte di buffer attualmente visualizzata sullo schermo, Emacs mostra un pezzo di quella riga nel minibuffer. Se proviamo a chiudere con una graffa una parentesi quadra, riceveremo un messaggio d'errore nel minibuffer. Tre variabili sono interessate dal parenmatching: (Ch v <variabile> per la doc): blinkmatchingparen, blinkmatchingdelay, blink matchingparendistance. 15 Commentare il codice!!! Commentare il codice e' molto importante, ecco perche' in Emacs non possono mancare funzioni apposite: commentbox commentdwim commentindent commentindentnewline commentkill commentline commentoruncommentregion commentregion commentsetcolumn 16 Commentare il codice!!! Ovviamente il codice viene commentato seguendo la sintassi corretta del linguaggio di programmazione che stiamo utilizzando. Come fa Emacs a sapere in che linguaggio stiamo scrivendo? Il majormode che utilizziamo dice tutto... 17 Major Modes Ogni "major mode" condiziona il comportamento di alcuni comandi oltre a fornire anche comandi appositi. Ogni "major mode" è anche il nome di un comando esteso con nome che serve per attivare quel major mode. Per esempio Mx c mode è il comando per attivare il modo "C" che utilizziamo per scrivere codice in C, rubymode e' quello che utilizziamo per scrivere codice ruby, textmode per il testo semplice e cosi' via... Emacs stabilisce quasi sempre quale major mode avviare leggendo l'estensione del file. E quando cio' non funziona cosa facciamo? Nel mio caso e' stato necessario istruire l'Editor (ricordate sempre la e maiuscola quando parlate di Emacs) per aprire i files ruby: (load "~/.emacs.d/rubymode.el") (addtolist 'automodealist '("\\.rb" . rubymode)) 18 Minor Modes I minor mode sono invece delle caratteristiche che si possono attivare o disattivare a seconda delle nostre esigenze. Ad esempio un minor mode e' l'Autofill che serve ad allineare automaticamente il testo. Questo minor mode puo' risultare molto utile nella modalita' textmode ma puo' non esserlo ad esempio nella rubymode. Di minor mode ne possiamo avere attivi contemporaneamente quanti ne desideriamo. Alcuni minor modes possono essere globali, altri attivabili solo in determinati buffers. Per sapere se un minor mode e' globale basta leggere la documentazione della funzione che ne effettua il toggling; Es.: per il minor mode relativo alle scrollbar basta un Ch f scrollbarmode. 19 Commentare e documentare Ritorniamo ai commenti... Esistono alcune applicazioni che, partendo da alcuni commenti presenti nel codice, redigono la documentazione relativa ai nostri sorgenti. Parliamo ad esempio di doxygen o gtkdoc (ma ne esistono altri ancora). Questi tool non prendono tutti i nostri commenti, ma solo quelli che seguono determinate regole di formattazione (che in linea di massima sono molto simili fra i vari sistemi). Per utilizzare doxymacs (il supporto a doxygen in Emacs), abbiamo bisogno di: W3, tempo, e libxml2 (versione >= 2.6.13). 20 Commentare e documentare Insegnare ad utilizzare doxygen non rientra negli scopi di questo geek evening (magari di un prossimo ...), ma vediamo velocemente come utilizzare doxymacs (supporremo di voler utilizzare doxymacs in cmode). Nel nostro .emacs inseriamo: (loadfile “~/.emacs.d/doxymacs.el”) (addhook 'cmodehook 'doxymacsmode) A questo punto aprendo un file .c avremo il minormode doxymacs attivo. Con Mx doxy<tab><tab> possiamo vedere quali funzioni ci fornisce (con Ch b le sue scorciatoie, con Ch m la sua documentazione). In generale le funzioni piu' utili sono doxymacsinsert* 21 Kill ring Il kill ring e' cio' che contiene tutto il testo che abbiamo tagliato, e' unico e condiviso fra tutti i buffers (con conseguenti evidenti vantaggi). Cy (yank) serve ad incollare l'ultimo frammento di testo tagliato, mentre per copiare del testo nel kill ring usiamo Mw o Cw (il primo copia, l'altro taglia). Con My possiamo invece muovere il puntatore nel killring. My e' disponibile solo se e' stato precedentemente lanciato uno yank o uno yankpop. Per vedere il contenuto del killring basta vedere il contenuto dell'omonima variabile, ovviamente con Ch v. 22 Selezioni rettangolari GNU Emacs, come anche vi (o forse dovremmo dire vi come Emacs), riesce a gestire le selezioni rettangolari. Dopo aver selezionato normalmente una porzione di testo, il rettangolo e' individuato dall'area compresa fra l'estremo iniziale e quello finale... beh le descrizioni geometriche non sono il mio forte... (comunque non mi sono mai servite a niente, ma e' bene sapere che esistono...) :P Scorciatoia Effetto C-x r k “Killa” il rettangolo C-x r y “Yanka” il rettangolo :P 23 Indentare il codice!!! Altrettanto importante, oltre a commentare il codice che scriviamo, e' indentarlo! Aiuta la leggibilita' ed in alcuni casi, vedi python, e' fondamentale se vogliamo che il programma che andiamo a scrivere funzioni... Per far si che Emacs sistemi l'indentazione del codice che abbiamo scritto basta selezionarlo ed eseguire Mx indentregion Tuttavia e' bene indentare il codice mentre lo scriviamo, quindi a volte anziche' Invio e' consigliabile un Cj, che e' bindato a newlineandindent. 24 Code Folding HideShow (o hs) e' un minor mode di Emacs che permette di nascondere temporaneamente blocchi di testo. Hideshow opera su blocchi di testo, espressioni ben bilanciate e commenti multi linea. L'utilizzo e' molto semplice. Innanzitutto richiamiamo hsminormode nel buffer in cui lo vogliamo utilizzare (o impostiamo un hook). Nel primo caso: Mx hsminormode A questo punto possiamo vedere la descrizione del minormode (Ch m). Da qui notiamo che le principali funzioni sono: hshideall, hsshowall, hshideblock, hsshowblock. Per vedere le scorciatoie associate a questo minor mode: Ch b 25 Code Folding - folding.el folding.el e' un'alternativa a hs… (lo troviamo su emacswiki.org) (loadfile “~/.emacs.d/folding.el”) Adesso configuriamolo per adoperarlo in buffer elisp: (addhook 'emacslispmodehook 'foldingmod) Le scorciatoie di folding.el sono pressoche' impossibili da ricordare, quindi ne ho settate, nel mio .emacs, alcune personalizzate: (addhook 'foldingmodehook '(lambda () (definekey foldingmodemap "\Cco" 'foldinghidecurrententry) (definekey foldingmodemap "\Cca" 'foldingshowcurrententry))) 26 Code Folding Fa uso di particolari commenti per individuare i blocchi su cui effettuare il folding/unfolding (i simboli in questione sono {{{ e }}} racchiusi fra dei commenti). Esempio: ;;{{{ (message “Hello World”) ;;}}} A questo punto, utilizzando delle scorciatoie (assolutamente impossibili da ricordare a meno che non le personalizziamo) o richiamando le funzioni foldingshowcurrententry e foldinghide currententry dal minibuffer, e' possibile mostrare/nascondere il blocco in questione. 27 Code Folding Esistono anche funzioni che permettono di nascondere/mostrare TUTTI I blocchi che presentano quei particolari commenti, ma per la descrizione completa del minor mode c'e' sempre Ch m L'installazione di folding.el e' semplice e intuitiva: (loadfile "~/.emacs.d/folding.el") (addhook 'emacslispmodehook 'foldingmode) Io ho settato queste scorciatoie nel mio .emacs: (addhook 'foldingmodehook '(lambda () (definekey foldingmodemap "\Cco" 'foldinghidecurrententry) (definekey foldingmodemap "\Cca" 'foldingshowcurrententry))) 28 Snippet please!!! Definiamo snippet dei piccoli pezzi di codice riusabile. Inserire degli snippet in un nostro buffer ci semplifica la vita aiutandoci a scrivere codice piu' rapidamente ripetendo quelli che sono ormai algoritmi consolidati. Una delle estensioni piu' popolari per la gestione degli snippet e' YASnippet (al solito YA sta per Yet Another... che fantasia...) L'installazione di yasnippet puo' essere effettuata o con un singolo file yasnippetbundle.el o proseguendo con la via classica del tar.bz2 . Sul sito ufficiale consiglia di utilizzare il bundle se si devono utilizzare template gia' esistenti, l'archivio se si necessita di creare altri template. In realta' io ho creato in tutta tranquillita' altri template pur utilizzando il bundle, quindi ci semplificheremo la vita e installeremo quello... 29 Tabba tabba!!! Ancora una volta vediamo cosa fare per avere questa feature in ruby mode: (require 'yasnippetbundle) (addhook 'rubymodehook 'yas/minormodeon) La prima riga e' necessaria per richiamare il file (ovviamente se non si trova ne loadpath non possiamo utilizzare require, ma dobbiamo affidarci a load). La seconda riga aggiunge un hook... Ormai sappiamo a che serve... Ora bisogna testarla... TAB TAB TAB!!! 30 To snippet: I snippet, you snippet... Scrivere codice in Pascal non e' la mia passione, ma purtroppo mi trovo a doverlo fare, quindi ecco come ho definito un template da utilizzare con yasnippet per questo obsoleto linguaggio: (il template completo e' su www.salug.it/~fabioviola/yapascal.el) (yas/definesnippets 'pascalmode '( ("prog" "PROGRAM ${nome}; BEGIN ${istr} END." "prog" nil) ("wln" "WRITELN(${arg});" "writeln" nil) ("rln" "READLN();" "readln" nil) … CUT … ("if" "IF ${cond} THEN ${istruzione};" "if" nil) ("case" "CASE ${espr} OF ${valore} : ${istruzione}${istruzioni}; END;" "func" nil) ) 'pascalmode) 31 snippet.el E' un'alternativa un po' macchinosa a yasnippet. Configurare snippet.el consiste nel creare i propri snippet nel file di configurazione seguendo queste semplici regole: $${default} : crea un campo con un valore di default che l'utente puo' cambiare o lasciare cosi'. Per ciclare fra i campi dichiarati con questa direttiva e' possibile tabbare $> : richiama, nel punto in cui e' inserito, indentaccordingtomode $. : specifica la fine dello snippet 32 snippet.el Esempio: (defineabbrevtable 'javascriptmodeabbrevtable ()) (snippetwithabbrevtable 'javascriptmodeabbrevtable ("forin" . "$>for (var $${i} in $${var}){\n$>$$;\n}$.$>") ("if" . "$>if ($${cond}){$>\n$>$.;\n}$>") ("ifel" . "$>if ($${cond}){$>\n$>$$;\n} else {$>\n$>$$;\n}$.$>") ("var" . "var $${variable} = $${value};") ("fun" . "$>function $${name}($${args}){\n$>$.\n}$>") ("lambda" . "$>function ($${args}){\n$>$.\n}$>") ("df" . "document.forms['$${formname}']") ("cl" . "console.log('$${message}');")) ;Firebug logging Per il sorgente completo vedere http://www.emacswiki.org/emacs/SnippetMode 33 snippet.el Una volta definito lo snippet sara' necessario aggiungere un hook: (addhook 'javascriptmodehook (lambda () (abbrevmode 1) (setq localabbrevtable javascriptmodeabbrevtable))) 34 Completamento - AutoComplete Si tratta di un plugin leggero e facile da configurare/estendere per il completamento di cio' che scriviamo. Per l'utilizzo normale e' sufficiente: (loadfile "~/.emacs.d/autocomplete.el") (globalautocompletemode t) Tuttavia questo potrebbe non essere sufficiente con major mode particolari, ad esempio mancano alcune parole chiave che utilzziamo con ruby... Ecco la soluzione > 35 Completamento - AutoComplete (defconst rubykeywords (sort (list "ADDITIONAL_LOAD_PATHS""ARGF" "ARGV" "ActionController" "ActionView" "ActiveRecord" "ArgumentError" "Array" "BasicSocket" "Benchmark" "Bignum" "Binding" "CGI" "CGIMethods" "CROSS_COMPILING" "Class" "ClassInheritableAttributes" "Comparable" "ConditionVariable" "Config" "Continuation" "DRb" "DRbIdConv" "DRbObject" "DRbUndumped" "Data" "Date" "DateTime" "Delegater" "Delegator" "Digest" "Dir" "ENV" "EOFError" "ERB" "Enumerable" "Errno" "Exception" "FALSE" "UNIXserver" "UNIXsocket" "UnboundMethod" "Url" "VERSION" "Verbose" "YAML" "ZeroDivisionError" "alias" "and" "BEGIN" "begin" "break" "case" "class" "def" CUT "defined""do""else""elsif""END""end""ensure""false""for""if""in""module""next""nil""not""or ""redo""rescue""retry""return""self""super""then""true""undef""unless""until""when""while"" yield" ) #'(lambda (a b) (> (length a) (length b))))) (defvar acsourceruby '((candidates . (lambda () (allcompletions actarget rubykeywords)))) "Source for ruby keywords.") (addhook 'rubymodehook (lambda () (makelocalvariable 'acsources) (setq acsources '(acsourceruby)))) 36 Completamento - Semantic Semantic e' uno degli strumenti forniti da Cedet. Una delle sue particolarita' che lo rende molto utile e' la possibilita', ad esempio, di completare la lista parametri di una funzione che stiamo chiamando, o di mostrarci quali sono i parametri che la funzione aspetta. In particolare, le funzioni piu' utili sono: semanticanalyzepossiblecompletions e semanticia completesymbols, ma per una spiegazione piu' esaustiva rimando a: http://www.emacswiki.org/emacs/SemanticBovinator 37 Compilare il codice: Mode compile Mode compile e' un pacchetto (fornito di default da Emacs) che permette di compilare files a seconda del major mode. I comandi di compilazione sono presenti per moltissime modalita', fra cui Cmode, Cplusplusmode, Makefilemode, Diredmode, AdaMode, Shmode, PythonMode, Tcl mode e bla bla bla... Inseriamo questo codice nel nostro .emacs: (autoload 'modecompile "modecompile" "Command to compile current buffer file based on the major mode" t) (globalsetkey "\Ccc" 'modecompile) (autoload 'modecompilekill "modecompile" "Command to kill a compilation launched by `modecompile'" t) (globalsetkey "\Cck" 'modecompilekill) 38 Compilare il codice: Mode compile A questo punto apriamo un sorgente, ad esempio C, e proviamo a compilare lanciando Cc c, scorciatoia che abbiamo creato poco fa. L'output della compilazione ci viene mostrato nella stessa finestra (frame in linguaggio emacsiano), in un altro frame (finestra nel linguaggio emacsiano) :P Per modificare le impostazioni relative alla compilazione con mode compile ed il linguaggio in questione (in questo caso C) possiamo lanciare Mx customizegroup compilec <Invio> 39 Debuggare - gdb Gdb, il GNU Debugger e' uno degli strumenti piu' utili per debuggare il codice. Possiamo lanciarlo all'interno di Emacs con Mx gdb. L'uso di gdb in Emacs non e' niente di diverso di quello che faremmo in un terminale... A meno che... Settiamo la variabile gdbmanywindows a true (consiglio di farlo nel .emacs in modo da non doverlo ripetere ogni volta) e........ MAGIA! L'attuale frame di Emacs viene suddiviso in piu' finestre e addirittura anche la speedbar puo' essere utilizzata con gdb. 40 Debuggare - gdb 41 Debuggare elisp Il buffer *Backtrace* e' quello che Emacs utilizza per mostrarci gli errori nell'esecuzione di codice Elisp. Per uscire da questo buffer e' sufficiente la pressione di q. Il buffer di backtrace si apre ad esempio quando, all'avvio di Emacs, vengono rilevati errori nell'init file. Alcune importanti variabili possono essere settate per migliorare l'utilizzo del debugger in elisp e sono: debugonquit, debugonerror e stacktrace onerror (ma data la scarsita' di programmatori elisp rimando, per questa sera, a Ch v). 42 Bookmarks I segnalibri (o bookmarks) non servono soltanto a chi scrive codice, ma possono tranquillamente essere utilizzati da chiunque, anche per semplici file di testo. L'utilizzo dei bookmark e' abbastanza intuitivo e tutto cio' che ci serve e' ricordare alcune scorciatoie (come sempre): Combinazione Descrizione C-x r l Lista tutti I segnalibri C-x r m Crea un nuovo segnalibro C-x r b Salta ad un segnalibro 43 Bookmarks Quando visitiamo la lista dei bookmarks possiamo effettuare le seguenti operazioni: * Aggiungere annotazioni (premendo e) * Vedere annotazioni per un determinato segnalibro (premendo a) * Vedere tutte le annotazioni di tutti i bookmarks (premendo A) * Rinominare un segnalibro (r) * Marcare vari segnalibri per l'eliminazione (k) * Mostrare il bookmark selezionato in un'altra finestra (o) Per scorrere fra i bookmarks in maniera piu' comoda possiamo adoperare: doremibookmarks, icycles (nuovamente), o bookmarkiterator 44 Sistemi di revisione Emacs e' fornito di una generica interfaccia verso I sistemi di revisione, chiamata VC. Supporta ConcurrentVersionsSystem (CVS), RevisionControlSystem (RCS), SCCS, Arch, Git, Mercurial, Bzr, Monotone, MetaCVS? e SubVersion (SVN). Combinazione Descrizione C-x v i Aggiunge un nuovo file al branch C-x v ~ Mostra le altre revisioni C-x v = Fa il diff con altre revisioni C-x v u Annulla il checkout C-x v c Cancella l'ultima revisione C-x v d Mostra I file che non sono aggiornati C-x v a Aggiorna il changelog C-x v s Tagga tutti i file con un nome simbolico C-x v r Annnulla i checkout fino a ritornare ad uno snapshot C-x v l Mostra il log C-x v m Merge 45 Sistemi di revisione In generale, oltre a vc, altre estensioni permettono la gestione di branch sotto sistema di revisione. I sistemi di revisione supportati sono DISTRIBUTED Git (attraverso vcgit.el – git.el – magit egg – egit – gitsum – gitemacs) Bazaar aka bzr (vcbzr.el bazaar.el) Mercurial aka hg (con mercurial.el – ahg.el) DaRcs (VcDarcs – darcs.el – darcsum.el –) MonoTone (monotone.el) ClearCase (DVC ?) CENTRALIZED Subversion aka svn (con SVK – svnmisc) CVS (con PclCVS – CVSAdminMode) RCS 46 Sistemi di revisione - bazaar.el Vediamo ora nella pratica una delle estensioni elencate prima: bazaar.el. Con vc avevamo gia' abbastanza per gestire un sistema di revisione, ma con bazaar.el possiamo accedere a funzioni particolari e tipiche di questo sistema di revisione. Come sempre andiamo nel .emacs (dopo aver scaricato l'estensione bazaar.el da EmacsWiki) e scriviamo: (loadfile “/path/to/bazaar.el”) CMx per eseguire subito l'istruzione senza dover riavviare (inutilmente) GNU Emacs. 47 Sistemi di revisione - bazaar.el Adesso Mx bazaar! Cosa succede? Ci viene chiesto il nome del branch...Ok, ma per farci che? Verra' eseguito un bzr status in quella cartella. Altre funzioni interessanti? Mx bazaar<tab><tab> bazaar.el e' solo un esempio... Io utilizzo bazaar, ma non questo minor mode... Per la maggior parte delle funzioni di interesse mi e' sufficiente vc, per i commit e quelle poche altre operazioni che vc non supporta mi basta un Mx ansiterm :P 48 RegExp Emacs fornisce un ottimo tool per la creazione di espressioni regolari e per il loro test al volo. Si tratta del rebuilder. Purtroppo funziona unicamente per listati lisp, ma vale davvero la pena di provarlo! Mx rebuilder <Enter> 49 Emacs Code Browser Emacs Code Browser e' un'utilissima estensione (e' un minor mode) che aggiunge al nostro frame delle finestre per navigare nel nostro codice con mouse e tastiera. Queste speciali finestre sono chiamate interactors. Installazione di ECB: Emacs Code Browser richiede CEDET (Collection of Emacs Development Environment Tools). Scarichiamo e installiamo la versione pre1.0. (addtolist 'loadpath "/home/val/.emacs.d/cedet/common") (require 'cedet) A questo punto e' ora di installare ecb 50 Emacs Code Browser Dopo aver decompresso l'archivio di ecb settiamo il nostro .emacs: (addtolist 'loadpath "/home/val/.emacs.d/ecb") (require 'ecbautoloads) Per una guida esasutiva all'utilizzo di ecb: http://ecb.sourceforge.net Per muovere i primi passi invece: apriamo un sorgente e diamo un: Mx ecbminormode <Invio> (consiglio di disattivare il tip of the day... e' antipatico... :P ) (setq ecbtipoftheday nil) 51 Piccola parentesi... CEDET-semantic CEDET e' una suite di strumenti creati allo scopo di trasformare Emacs in un potente ambiente di sviluppo. Le utility di CEDET richieste da ECB sono: * Semantic (vedere pagina apposita) 52 Piccola parentesi... CEDET-eieio * EIEIO (Enanched Implementation of Emacs Interpreted Objects): “nu se capisce nu furmine”... http://cedet.sourceforge.net/eieio.shtml Scherzi a parte, implementa una metodologia di sviluppo orientata agli oggetti controllata, seguendo lo standard CLOS. EIEIO fornisce funzionalita' di browsing del codice e dei custom widgets. Lo standard CLOS(Common Lisp Object System) permette di aggiungere il supporto agli oggetti a dialetti del Lisp che ne sono sprovvisti, ad esempio Elisp. 53 Piccola parentesi... CEDET-speedbar * Speedbar (in realta' fa gia' parte di Emacs): si tratta di un Everything Browser. Lanciando la speedbar viene creato un nuovo frame che puo' effettivamente essere utilizzato per browsare tutto, dal codice agli utenti presenti su un canale di chat IRC. Per richiamare la speedbar basta un Mx speedbar, mentre per attivarla permanentemente: (speedbar t) Sebbene l'apertura in un nuovo frame sia il comportamento di default, e' ovviamente modificabile. 54 Aprire un terminale Per avere un terminale all'interno di Emacs abbiamo varie possibilita': * Eshell: si tratta di una shell scritta interamente in emacs lisp, disponibile in ogni distribuzione di Emacs. E' veramente utilissima, soprattutto su sistemi operativi privi di un reale interprete dei comandi... Fa parte di Emacs dalla versione 21 dell'editor. * AnsiTerm: emulatore di terminale scritto in emacs lisp. * Term: molto simile ad AnsiTerm * ShellMode: un'utility esterna che puo' usufruire anche delle comodita' fornite da icicle. * Multiterm: permette la gestione di terminali multipli 55 DIFF DiffMode e' un major mode standard di Emacs per evidenziare e navigare il contenuto dei diff file. Per migliorare il comportamento di DiffMode possiamo utilizzare: Diff2Ediff DiffEnanchements DiffSaveBuffer (non e' un major mode che ho utilizzato molto, quindi vi rimando alla doc ufficiale) 56 Editare file remoti... TRAMP (Transparent Remote Access, Multiple Protocols) e' un pacchetto per editare file remoti. Configurare velocemente: (setq trampdefaultmethod "ssh") A questo punto possiamo aprire il file con: Cx Cf /remotehost:filename <Enter> (or Cx Cf /method: user@remotehost:filename) . Per problemi di performance e' consigliabile utilizzare shfs. 57 Editare archivi... Archivemode e' un major mode che consente di effettuare alcune operazioni su archivi, tipicamente listarne il contenuto, estrarre un file e, se possibile, memorizzarlo o cancellarlo nell'archivio stesso. Archive mode non fa uso soltanto di funzioni elisp, ma si appoggia ad utility esterne. I tipi di archivi che vengono gestiti attualmente sono: tar non compressi, tar compressi con gzip, bzip2 e compress. (vi serve lo script tgz se volete anche poterli modificare), zip, lha e lzh, zoo, cpio, arc (vi serve il programma arc), arj (in sola lettura e vi serve il programma unarj), deb (in sola lettura e vi serve lo script debarc), rpm (in sola lettura e vi serve lo script rpmarc), sit (in sola lettura; è roba Apple quindi non ce ne sbatte niente...) 58 Editare archivi... L'installazione di achivemode e' ancora una volta data da: (loadfile “~/.emacs.d/archivemode.el”) Il file archivemode.el contiene del codice comune in grado di gestire qualsiasi tipo di archivio utilizzando gli appositi handler e gli handler specifici per ogni archivio. Ciascun handler definisce per ogni tipo di archivio Le varie estensioni dei files con cui è possibile identificare il tipo di archivio, un comando per listare il contenuto dell'archivio, un comando per estrarre un singolo file dall'archivio, un comando per memorizzare un singolo file nell'archivio, un comando per cancellare un singolo file dall'archivio, un'espressione regolare per poter cercare l'inizio dei nomi dei files nella lista, oppure una funzione lisp in grado di estrarre direttamente il nome, una funzione opzionale per settare il majormode in base all'estensione del file, se non specificata viene usata la funzione archivemode che determina automaticamente l'handler 59 dall'estensione. Artist-mode Puo' essere utile disegnare in ASCII art nei nostri sorgenti per far capire all'utente cio' che intendiamo... Ad esempio nel plugin dell'aereoplano di Compiz, Carlo ha inserito un disegno per far capire come la finestra si piega per dare vita ad un aereo... Questi disegni possono essere fatti con ArtistMode, un majormode che trasforma temporaneamente il nostro ambiente in un programma di grafica... ASCII... :P http://www.cinsk.org/emacs/emacsartist.html 60 Script-fu Chi lavora con la grafica, e in particolare con TheGimp, puo' sentire l'esigenza di estendere l'applicazione con nuovi script. Cio' si puo' fare con vari linguaggi: Perl, Python, Ruby, ma il linguaggio piu' utilizzato, e quello che troviamo sicuramente in ogni installazione di TheGimp e' SIOD. SIOD?????????? E' un altro dialetto del Lisp, anzi, per la precisione di Scheme, che e' un dialetto di Lisp. Scriptfu e' in realta' solo un altro nome per chiamare SIOD. Per lavorare con gli scriptfu e' utile GimpMode. Fornisce autocompletamento del codice, interazione con Gimp come client o subprocess, echoing della documentazione e tanto altro... E' una delle modalita' che approfondiro' di piu' in questa primavera (seguira' un g.e. sul gimpsripting) 61 In futuro... Ecco le estensioni (major o minor modes) che indendo provare nel medio/lungo periodo: (se qualcuno le ha gia' provate mi faccia sapere che sono curioso ) GimpMode: http://www.emacswiki.org/emacsen/GimpMode (per lo sviluppo degli scriptfu) MozRepl: http://wiki.github.com/bard/mozrepl Ctags: http://www.emacswiki.org/emacs/ExuberantCtags 62 GNU/Emacs – powerful developing tool Strumenti citati/utilizzati: Iswitchb: http://www.emacswiki.org/emacs/IswitchBuffers Ido: http://www.emacswiki.org/emacs/InteractivelyDoThings Icicle: http://www.emacswiki.org/emacs/Icicles Linum: http://stud4.tuwien.ac.at/~e0225855/linum/linum.html Flymake: http://flymake.sourceforge.net/ Flymakeruby: http://www.emacswiki.org/cgibin/wiki/FlymakeRuby Doxymacs: http://doxymacs.sourceforge.net/ Hideshow: http://www.emacswiki.org/emacs/HideShow folding.el: http://www.emacswiki.org/cgibin/wiki/FoldingMode Yasnippet: http://code.google.com/p/yasnippet/ snippet.el: http://www.emacswiki.org/emacs/SnippetMode Modecompile: http://www.emacswiki.org/emacs/ModeCompile 63 GNU/Emacs – powerful developing tool Gdb: http://www.emacswiki.org/emacs/GrandUnifiedDebugger#toc1 Vc: http://www.emacswiki.org/emacs/VersionControl Rebuilder: http://www.emacswiki.org/cgibin/wiki/ReBuilder Ecb: http://ecb.sourceforge.net/ Cedet: http://cedet.sourceforge.net/ Semantic: http://cedet.sourceforge.net/semantic.shtml Eieio: http://cedet.sourceforge.net/eieio.shtml Speedbar: http://cedet.sourceforge.net/speedbar.shtml Tramp: http://www.emacswiki.org/emacs/TrampMode Archivemode: http://www.pluto.it/files/journal/pj9806/archivemode.html Gimpmode: http://niels.kicksass.org/public/GimpMode/index.html Artistmode: http://www.cinsk.org/emacs/emacsartist.html Doremibookmarks: http://www.emacswiki.org/emacs/DoReMi Bookmarkiterator: http://www.emacswiki.org/emacs/BookMarkIteratorPackage 64 GNU/Emacs – powerful developing tool DiffMode: http://www.emacswiki.org/emacs/DiffMode Diff2Ediff: http://www.emacswiki.org/emacs/Diff2Ediff DiffEnanchements: http://www.emacswiki.org/emacs/DiffEnhancements DiffSaveBuffer: http://www.emacswiki.org/emacs/DiffSaveBuffer EdiffMode: http://www.emacswiki.org/emacs/EdiffMode Eshell: http://www.emacswiki.org/emacs/?action=browse;oldid=EmacsShell;id=CategoryEshell ShellMode: http://www.emacswiki.org/emacs/ShellMode AnsiTerm: http://www.emacswiki.org/emacs/AnsiTerm 65 Saluti e licenza... Per questo breve appuntamento con la customizzazione di GNU/Emacs per lo sviluppo e' tutto, spero di aver soddisfatto le vostre curiosita' e di avervi convinti ad avvicinarvi a questo fantastico mondo! Queste slides sono rilasciate con LICENZA CREATIVE COMMONS 3.0 ATTRIBUTION, SHARE ALIKE, NON COMMERCIAL valvo <[email protected]> 66