Personal tools
Plone + Sublime Text: gli snippets ti salveranno la vita

ho visto fiumi di codice racchiusi in semplici comandi

Mar 12, 2014

Plone + Sublime Text: gli snippets ti salveranno la vita

Gli snippets di Sublime Text possono dare una grossa mano a chi, sviluppando, deve continuamente scrivere gli stessi pezzi di codice come un'automa semi-senziente

Come programmatore Plone (ma non solo), capita spesso di dover scrivere dei pezzi di codice già inseriti altre mille volte.

Questo perché in genere la struttura di base del lavoro è sempre la stessa - per esempio registrare un nuovo css, creare una nuova vista oppure un Archetype.

copy-pasteDi solito ci sono due strade da intraprendere per non scrivere "a braccio" l'intero codice che ci serve:

  • copiare il testo che ci serve da altri file dove l'abbiamo già utilizzato, o da risorse su internet
  • utilizzare template predefiniti forniti da diversi strumenti di supporto come paster o mr.bob (di cui avevo parlato in un precedente post).
La prima soluzione è comoda perché, se dobbiamo replicare del codice che abbiamo già scritto, possiamo facilmente recuperarlo e utilizzarlo. Il problema è che a volte può essere difficile ricordarsi in quale progetto o file è stato utilizzato il codice desiderato.

La seconda è ottima perché, se si trovano i template che ci servono, con pochi comandi si possono generare scheletri per quasi qualsiasi componente. In particolare, con ZopeSkel è possibile, all'interno di un pacchetto, creare anche degli Archetype programmaticamente da riga di comando.

Questa soluzione, però non mi piace molto: trovo che sia comoda solo nella fase iniziale del progetto, quando da console si crea il prodotto (con paster o con mr.bob) con tutti i componenti che servono in quel momento (profilo di registrazione, portlet, archetype, ecc.).
Lo sviluppo, poi, si sposta sull'editor di testo (nel mio caso Sublime Text) e quindi se devo creare un nuovo contenuto Dexterity/Archetype, aggiungere una portlet o registrare una nuova vista, trovo molto scomodo cambiare contesto, tornare sulla console e lanciare il relativo comando (sempre che esista).

Per questo ho iniziato a utilizzare gli snippets di Sublime Text, che danno una grandissima mano nel lavoro di tutti i giorni.

Gli snippets non sono altro che dei file contenenti dei frammenti di codice richiamabili con una certa sequenza di caratteri.

Un esempio di snippet è il seguente:

<snippet>
    <content><![CDATA[import pdb;pdb.set_trace()]]></content>
    <!-- Opzionale: Tab trigger per attivare lo snippet -->
    <tabTrigger>pdb</tabTrigger>
    <!-- Opzionale: contesto dove il trigger è abilitato -->
    <scope>source.python</scope>
    <!-- Opzionale: Descrizione che apparirà nel menu -->
    <description>Inserimento del pdb</description>
</snippet>

Come si vede dall'esempio, le parti principali sono:

  • content: il codice vero e proprio che costituisce lo snippet. Può contenere qualunque testo, l'importante è che sia racchiuso all'interno di <![CDATA[ ]]>
  • tabTrigger: una sequenza di caratteri che permette la selezione dello snippet (poi lo spiego meglio)
  • scope: il contesto dove abilitare lo snippet. Se non presente, lo snippet può essere utilizzato in qualunque file aperto nell'editor, mentre se lo scope è impostato (come nell'esempio) sarà disponibile solamente nei file indicati (nel nostro caso quindi solo nei file python)
  • description: una descrizione per aiutare l'utente quando ci sono più snippet con trigger simili.

Per poter funzionare ed essere riconosciuto come tale, il file deve essere salvato con l'estensione ".sublime-snippet". Per comodità le prime prove si possono anche salvare all'interno della cartella "User" di Sublime (su osx si trova qui: Library/Application Support/Sublime Text 2/Packages/User), ma dovendone creare diversi, è meglio un'organizzazione più strutturata.

Selezione degli snippet

La selezione di uno snippet può avvenire in diversi modi.
Per esempio, si possono ricercare e selezionare direttamente dal pannello di controllo (cmd+shift+p) scrivendo il nome del trigger o la descrizione dello snippet desiderato.

Oppure, si può scrivere il tabTrigger direttamente nell'editor e premere "tab" una volta completato.
Mentre si sta digitando (per non doverlo scrivere tutto), si può sfruttare l'autocompletamento dell'editor, che può essere automatico (nel caso dei file python nel mio caso, per esempio) e ci propone direttamente le varie possibili opzioni, oppure richiamandolo manualmente premendo ctrl + barra spaziatrice.

In ogni caso, una volta selezionato, lo snippet inserirà nel testo il pezzo di codice desiderato, senza nessuno sforzo.

Variabili e parametri

Un altro aspetto molto utile degli snippets è che si possono inserire delle variabili o dei parametri all'interno del codice.
Le variabili possono essere definite all'interno di un file di configurazione e inserite all'interno del codice, mentre i parametri possono essere presi in input dall'utente.

Questi ultimi sono molto utili in quanto può capitare che, all'interno della parte di codice da inserire, alcuni pezzi non sono uguali per ogni situazione, e devono essere parametrici (ad esempio il nome del prodotto o il dominio delle traduzioni) e/o ripetuti più volte:

<content><![CDATA[
Name: ${1}
Surname: ${2}
Fullname: ${1} ${2}
]]></content>

Nell'esempio, il nome completo (Fullname) deve essere composto dal nome e dal cognome, quindi per evitare di scriverli due volte, si marcano i due campi come parametrici (con la notazione: ${numero}), e se c'è bisogno dello stesso valore in più punti, basta riutilizzare lo stesso numero.
Quando si inserisce uno snippet e sono presenti dei parametri, il cursore si posiziona automaticamente sul primo, e utilizzando il tasto "tab" si passa al successivo (essendo i parametri dei numeri progressivi).

I parametri possono anche avere dei valori di default, che vengono utilizzati nel caso non venga inserito nessun valore:

<content><![CDATA[
Name: ${1:Paolino}
Surname: ${2:Paperino}
Fullname: ${1} ${2}
]]></content>

In questo caso, se si seleziona lo snippet e non si scrive nulla, il Fullname sarà "Paolino Paperino".

Ulteriori informazioni le potete trovare in questa documentazione non ufficiale e, se cercate nel gestore di pacchetti di Sublime Text o su github, potete trovare molti plugin con degli snippets per framework e linguaggi diversi (per esempio AngularJS, Foundation, CSS, Javascript, Node.JS).

Per il mio lavoro di tutti i giorni (Plone, quindi) ho creato un plugin per Sublime contenente una serie di snippets per poter creare qualsiasi cosa mi venga in mente (vocabolari, jsregistry, browserlayer), in modo da non dover ogni volta andare a cercare nel codice vecchio oppure in rete.


E' tutto su github e in continua evoluzione, quindi se qualcuno volesse contribuire aggiungendo nuove configurazioni, è il benvenuto!

Uncle Sam

comments powered by Disqus