Python e Vim: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
m (Aggiunta Tips)
(guida estesa e verificata)
 
(45 versioni intermedie di 6 utenti non mostrate)
Riga 1: Riga 1:
{{Versioni compatibili}}
== Introduzione ==
== Introduzione ==
Questa pagina raccoglie piccoli suggerimenti per sfruttare al meglio [http://www.vim.org/ Vim] e gVim con il linguaggio di programmazione [http://www.python.org/ Python].


Questa guida � dedicata all'uso di Aptitude.
== Syntax Higlight ==
La prima funzione che generalmente si abilita quando si usa un editor per programmazione è il ''syntax highlight''.


Il completissimo '''manuale utente di Aptitude''' in formato html si pu� trovare in <tt>/usr/share/doc/aptitude/html/en/index.html</tt>, installando il pacchetto <tt>aptitude-doc-en</tt>. Purtroppo il manuale � solo in inglese.
Per abilitarlo in Vim per i vari linguaggi (incluso Python) è sufficiente decommentare in <code>/etc/vim/vimrc</code> la riga:


== Cos'� Aptitude ==
<pre>syntax on</pre>


Aptitude � un frontend per la gestione avanzata dei pacchetti di una distribuzione Debian, ma risulta valida per tutte le distribuzioni che supportano APT (http://www.debian.org/doc/manuals/apt-howto/ch-distros.it.html).
Se invece si volesse abilitare questa funzionalità unicamente per il proprio utente, o se non si disponesse dei privilegi di superutente, si può creare un file <code>~/.vimrc</code> contenente quella riga che dunque andrà a sovrascrivere il comportamento di default.


Aptitude � ormai lo strumento preferenziale per l'amministrazione dei pacchetti su Debian, in quanto non solo raggruppa in un unico semplice programma le funzionalit� di molti tool (apt-get, apt-cache ...) ma anche perch� permette di gestire in modo molto pi� facile (ed efficace) situazioni complesse (dipendenze, dipendenze inverse, rimozione pacchetti non utilizzati, ecc ...).
== Gestire l'indentazione: TAB, spazi e ''autoindent'' ==
In Python è di vitale importanza gestire correttamente l'indentazione dato che (a differenza dei linguaggi ''free-form'' come il C) questa è parte integrante della sintassi.


Aptitude � un frontend a dpkg esattamente come apt-get, che sembra essere destinato a sostituire integralmente lo stesso [[Introduzione_all%27_Apt_System | apt-get (e affini)]], tanto che nelle release notes di Sarge si legge:
Il Python di per sé riconosce ogni tipo di indentazione (TAB, spazi, o un mix dei due). Nei moderni sistemi il TAB ha tuttavia una larghezza variabile ed impostabile a piacere. Per evitare dunque problemi di interoperabilità tra persone che usano convezioni diverse è universalmente consigliato di usare nei file di codice Python solamente spazi oppure solamente TAB. Anche l'uso esclusivo di TAB può talvolta creare dei problemi di visualizzazione (e quindi difficoltà di lettura) a causa di una diversa larghezza usata. Per tagliare la testa al toro, dunque, il modo più robusto e portabile di programmare in Python è quello di usare soltanto spazi. È possibile impostare qualsiasi editor per programmazione in modo da sostituire automaticamente al TAB un numero di spazi pari alla larghezza dell'indentazione, e ovviamente anche Vim non è da meno. La larghezza per una unità di indentazione usata quasi universalmente in Python, come raccomandato nella [https://www.python.org/dev/peps/pep-0008/#indentation PEP 8], è pari ad una larghezza di 4 spazi. Per ricapitolare il nostro scopo è ottenere:


{{Box|Citazione:|Il metodo di aggiornamento raccomandato fra le release Debian GNU/Linux prevede l'utilizzo dello strumento di gestione dei pacchetti aptitude. Tale strumento rende le decisioni riguardanti le installazioni dei pacchetti pi� sicure che l'esecuzione diretta di apt-get.}}
* sostituzione alla pressione del tasto TAB con un numero equivalente di spazi;
* larghezza indentazione pari a 4 spazi.


e anche:
Per ottenere questo comportamento in Vim/gVim si possono decommentare le seguenti righe nel file di configurazione <code>/etc/vim/vimrc</code>:
<pre>  if has("autocmd")
    filetype plugin indent on
  endif</pre>


{{Box|Citazione:|Test di aggiornamento hanno mostrato che la versione di sarge di aptitude � migliore sia di apt-get sia della versione di woody di aptitude nella risoluzione di dipendenze complesse durante un aggiornamento.}}
ed inserire il seguente codice nello stesso file:
<pre>  autocmd FileType python setlocal et sw=4 sts=4 sta tw=79</pre>


Si pu� utilizzare Aptitude in due modi: da linea di comando, cio� come apt-get (la sintassi e le opzioni sono identiche, o quasi), oppure tramite l'interfaccia visuale basata sulle librerie ncurses.
Il primo abilita l'indentazione automatica per i vari linguaggi di programmazione. In particolare per il Python, se ad esempio dichiariamo una funzione su una riga, andando a capo avremo già il cursore indentato per poter scrivere il corpo della funzione con la giusta indentazione. Stessa cosa vale per i vari <code>'''if'''</code>, <code>'''for'''</code>, ecc... Questa funzione è utile anche per accorgersi di errori sintattici come la mancanza dei :, poiché la loro assenza fa si che il cursore non venga indentato.


L'interfaccia visuale verr� trattata pi� diffusamente, perch� si ritiene che sia uno strumento fondamentale per la gestione dei pacchetti e soprattutto per la diagnostica e la risoluzione degli eventuali problemi riscontrati.
La riga aggiunta associa ai tipi di file Python le seguenti impostazioni:


{{Box|Prima di iniziare|Prima di iniziare a mettere le mani sulla tastiera, notiamo che aptitude, a differenza della maggior parte delle opzioni di apt-get, si pu� lanciare anche con i diritti di utente comune.  
;<code>tabstop</code> oppure <code>ts</code>: larghezza del carattere TAB, quando incontrato nel file. Noi non useremo caratteri TAB, quindi questa impostazione può essere ignorata (e infatti non è riportata nell'esempio precedente). Viene elencata qui solo per chiarezza e completezza.


Poich� per l'effettiva installazione o rimozione dei pacchetti � necessario possedere i diritti di root, � possibile e caldamente consigliato usare questa possibilit� per effettuare qualunque prova, visto che non si sar� in grado di modificare neanche una virgola del sistema prima di aver inserito la password di root.}}
;<code>expandtab</code> oppure <code>et</code>: riempe con spazi le indentazioni generate dalla pressione del tasto TAB.


== Uso da linea di comando ==
;<code>shiftwidth</code> oppure <code>sw</code>: larghezza di un rientro dell'indentazione automatica. È usato anche per definire la larghezza del rientro che si aggiunge o toglie ad un blocco di testo quando si seleziona (con '''V''') e poi si indenta/deindenta con '''>''' o con '''<'''.


Anche dalla linea di comando l'uso di aptitude � molto semplice e comodo. Si usa in genere la seguente forma:
;<code>softtabstop</code> oppure <code>sts</code>: larghezza di un rientro causato dalla pressione di un TAB. Il rientro è creato inserendo spazi se <code>'''et'''</code> è settato, altrimenti viene usata una combinazione di spazi e caratteri TAB (questi ultimi hanno larghezza <code>'''ts'''</code>).


aptitude azione [argomenti...]
;<code>smarttab</code> oppure <code>sta</code>: in combinazione con le opzioni precedenti questa impostazione permette di cancellare un rientro (4 spazi ''reali ''nel nostro caso) con una sola pressione del tasto '''BS''' (o '''BackSpace''').


''azione'' dice ad aptitude quale azione svolgere; i rimanenti argomenti dipendono dall'azione scelta e consistono tipicamente in una lista di nomi di pacchetti.
;<code>textwidth</code> oppure <code>tw</code>: lunghezza massima del testo inserito. Una riga più lunga viene spezzata dopo uno spazio bianco per stare in questi limiti.


Le azioni pi� importanti sono:
== Folding: le piegature nel codice ==
Una funzione comoda durante la programmazione è la possibilità di ripiegare del codice (ad esempio una funzione o una classe) in modo di avere una visione più compatta del file e facilitare la navigazione.


; <tt>aptitude update</tt> : aggiorna la lista dei pacchetti (come premere ''''u'''' dall'interfaccia visuale o come <tt> apt-get update</tt>)
Questo è possibile in Vim tramite il ''folding'' (''piegature''). Esistono dei plugin per Vim che riconoscono le strutture sintattiche del Python e creano automaticamente le piegature. Tuttavia il metodo illustrato di seguito è ancora più semplice: piegature automatiche in base all'indentazione. Nel caso del Python questo semplice metodo è particolarmente efficace.


; <tt>aptitude upgrade</tt> : aggiorna tutti i pacchetti aggiornabili senza che nascano conflitti. Se l'aggiornamento di un pacchetto causa un conflitto il pacchetto non viene aggiornato (piuttosto che, ad esempio, rimuovere i pacchetti che generano il conflitto)
Per abilitarlo basta inserire in <code>/etc/vim/vimrc</code>:


; <tt>aptitude dist-upgrade</tt> : anche questo comando aggiorna tutti i pacchetti, ma � pi� aggressivo nella risoluzione delle dipendenze: nuovi pacchetti saranno installati e altri rimossi, fino a quando tutte le dipendenze non saranno soddifatte. Questo comando potrebbe fare cose non desiderate (come, appunto, installare nuovi pacchetti o rimuoverne altri) quindi deve essere usato con cautela.
<pre>set foldmethod=indent</pre>


; <tt>aptitude [ install | remove | purge | reinstall ] pkg1 [pkg2...]</tt>: questi comandi installano, rimuovono o fanno il ''purge'' (eliminazione anche dei file di configurazione) dei pacchetti specificati.
Di seguito sono elencati i principali comandi per gestire le piegature:


; <tt>aptitude search espressione1 [espressione2...]</tt>: mostra su terminale i pacchetti che contengono nel nome una delle espressioni fornite. Le espressioni possono essere semplici stringhe o anche espressioni pi� complesse ("Search Patterns").
;<code>zo</code> oppure Spazio: apre la piegature sotto il cursore (un solo livello)
;<code>zO</code>: apre la piegature sotto il cursore e ricorsivamente tutte le piegature in essa contenute
;<code>zc</code>: chiude la piegatura alla quale appartiene il blocco di codice indicato dal cursore (un solo livello)
;<code>zC</code>: chiude la piegatura alla quale appartiene il blocco di codice indicato dal cursore e ricorsivamente tutte le piegature che la contengono
;<code>zr</code>: apre tutte le piegature del file corrente di un livello
;<code>zR</code>: apre completamente le piegature contenute nel file corrente (tutti i livelli)
;<code>zm</code>: chiude tutte le piegature del file corrente di un livello
;<code>zM</code>: chiude completamente le piegature contenute nel file corrente (tutti i livelli)


; <tt>aptitude show pkg1 [pkg2...]</tt> : mostra su terminale le informazioni di ogni pacchetto specificato.
== Eseguire Python da Vim ==
Vim possiede caratteristiche avanzate che permettono di impostare i compilatori da usare per ogni linguaggio e il metodo di esecuzione del <code>make</code>.


I comandi che installano, aggiornano o rimuovo pacchetti accettano tutti il parametro "-s" che st� per "simula". Quando viene passato "-s" nella linea di comando, aptitude svolge tutte le azioni che svolgerebbe normalmente, ma non scarica o installa/rimuove effettivamente nessun file.
Nel caso del Python propongo una soluzione ''quick and dirty'' che associa ad un tasto l'esecuzione dello script.


==Interfaccia grafica==
Aggiungendo nell'ormai famoso <code>/etc/vim/vimrc</code>


=== Descrizione dell'interfaccia grafica ===
La prima schermata che aptitude ci presenta, dopo che l'abbiamo lanciato da linea di comando, e dopo il caricamento delle informazioni attuali sui pacchetti ("caricamento della cache"), divisa orizzontalmente in due parti.
Nella parte superiore troviamo una zona a sfondo blu con un men che propone diverse opzioni, e una zona a sfondo nero in cui si vede l'albero dei pacchetti disponibili, classificati in base al loro stato (installati, non installati, ecc.).
Per vedere il contenuto di uno dei rami usiamo le frecce "su" e "giu" fino a selezionare la riga corrispondente e premiamo invio. Sotto al ramo in questione ora abbiamo dei sotto-rami, e premendo invio sui vari sotto-rami si accede allo stesso modo ai sotto-sotto-rami e cos via, fino ad arrivare ai pacchetti.
La parte inferiore invece dedicata alla descrizione del pacchetto attualmente selezionato. Alcuni pacchetti, per esempio k3b, hanno una descrizione molto lunga: premendo TAB e usando le frecce possibile leggerla tutta.
Ogni riga che mostra il nome di un pacchetto riporta anche molte informazioni.
Per esempio, riporto lo stato di alcuni pacchetti nel mio sistema (nota: il mio sistema una sarge, ma ho installato diversi pacchetti da testing e anche alcuni da unstable. Per informazioni sul pinning vedere [[APT_uso_avanzato:_mixare_releases_diverse | APT uso avanzato: mixare releases diverse ]]):
<pre>
<pre>
stato    nome                vers. attuale    vers. aggiornata
" Running Python by pushing F5
 
map <f5> :w<CR>:!python %<CR>
i        aptitude            0.2.15.9-2      0.2.15.9-2
i        amule                2.0.3-3          2.0.3-4
i A      amule-common        2.0.3-3          2.0.3-4
c        hotplug              <nessuna>       0.0.200403
p        apmd                <nessuna>       3.2.2-3
</pre>
</pre>


Possiamo vedere che:
oppure, nel caso in cui si usi Python 3,
*aptitude � installato ed � alla versione pi� recente
*amule � installato ma � aggiornabile alla versione 2.0.3-4
*amule-common � installato per soddisfare una dipendenza (<tt>A</tt>), cio� solo a causa di un pacchetto che dipende da lui (amule). Anch'esso � aggiornabile
*hotplug non � installato, ma quando l'ho cancellato ho scelto di mantenere i file di configurazione (<tt>c</tt>)
*apmd non � installato (<tt>p</tt>), oppure � stato cancellato con l'opzione "purge" (comando: "_"): lo stato risultante � il medesimo


Tramite semplici comandi si possono visualizzare molte altre informazioni. I comandi principali sono:
; v: visualizza le versioni disponibili per il pacchetto
; d: visualizza le dipendenze del pacchetto
; r: visualizza i pacchetti che dipendono dal pacchetto selezionato (dipendenze inverse)
; C: scarica da internet e visualizza il changelog del pacchetto
; q: chiude la schermata attuale e passa a quella precedente
Per una lista completa vedere la guida online con "?".
Ora premiamo invio su di un pacchetto: ci appare la schermata relativa al pacchetto, con la descrizione completa e molte altre informazioni, organizzate ad albero come abbiamo gi visto. Se ci interessa qualche informazione in pi su uno dei pacchetti che troviamo in questa schermata, lo selezioniamo e premiamo invio: appaiono le versioni disponibili del pacchetto. Se selezioniamo una delle versioni e premiamo invio ci ritroviamo nella schermata informativa di quel pacchetto. Fate attenzione perch in questo modo si pu perdere facilmente l'orientamento.
Torniamo alla vista dell'albero dei pacchetti premendo "q" tante volte quanto serve (se vi sbagliate e lo premete una volta in pi, aptitude vi chiede se volete uscire dal programma: per il momento dite di no ;-)).
=== Riassunto principali comandi ===
; <tt>u</tt>  ''(minuscolo)'': aggiorna la lista dei pacchetti.
; <tt>+</tt>: marca il pacchetto selezionato per l'installazione o l'aggiornamento.
; <tt>-</tt> ''(segno meno)'': marca il pacchetto selezionato per la rimozione.
; <tt>_</tt> ''(underscore)'': marca il pacchetto selezionato per la rimozione, eliminando tutti i file di configurazione (''purge'').
; <tt>U</tt>  ''(maiuscolo)'': marca per l'aggiornamento tutti i pacchetti per cui sia disponibile una nuova versione.
; <tt>=</tt> : mette in '''hold''' il pacchetto selezionato. Questo vuol dire che il pacchetto non verr aggiornato anche se una nuova versione disponibile e si seleziona di aggiornare i pacchetti (ad esempio con '''<tt>U</tt>''').
; <tt>C</tt> ''(maiuscolo)'': scarica e mostra il changelog del pacchetto selezionato.
{{Box|Nota|Dopo aver premuto uno dei comandi '''<tt>+</tt>''', '''<tt>-</tt>''', '''<tt>_</tt>''' o '''<tt>U</tt>''' bisogner premere due volte '''g''' per eseguire le azioni richieste: dopo la prima volta verr visualizzata il lista dei pacchetti installati/aggiornati/rimossi/mantenuti, dopo il secondo '''g''' verranno eseguite le operazioni richieste.}}
=== Esempio: aggiornare i pacchetti ===
Per la descrizione dell'utilizzo di aptitude useremo come esempio una sessione reale, in cui vengono svolte alcune normali operazioni di aggiornamento e amministrazione dei pacchetti.
Per prima cosa, nella nostra sessione di amministrazione, aggiorniamo le informazioni sui pacchetti disponibili. Con apt-get avremmo digitato <tt>apt-get update</tt>, mentre in aptitude sufficiente premere "u".
Fate attenzione perch aptitude non chiede conferma dopo che avete impartito un comando, quindi non digitate nulla senza prima essere sicuri/e di cosa state per fare.
Dopo aver fatto l'update potremmo trovare una, due, o tre voci nuove nell'albero dei pacchetti: "Aggiornamenti di sicurezza", "Pacchetti aggiornabili", e "Pacchetti nuovi". Per fare scomparire le prime due necessario aggiornare tutti i pacchetti contenuti nei rispettivi rami, mentre per far sparire la terza sufficiente premere "f" (forget).
Una buona regola per l'amministratore quella di far s che alla fine dell'aggiornamento queste tre voci non siano presenti. Se ci sono dei pacchetti che risultano aggiornabili, ma che non volete aggiornare, probabilmente dovreste bloccarli alla versione desiderata con "=", oppure dovreste leggere la guida gi citata sul pinning.
Ora torniamo ai pacchetti mostrati prima e supponiamo di voler aggiornare amule: lo selezioniamo e premiamo "+". Questo marcher in verde, cio per l'installazione, sia amule che amule-common.
Poi per ci viene un'idea migliore, e decidiamo di aggiornare tutti i pacchetti aggiornabili, quindi digitiamo "^" per risalire al ramo superiore della vista, finch arriviamo a <tt>Pacchetti installati</tt> poi usiamo la freccia in alto e se necessario risaliamo ancora ai rami superiori finch non arriviamo a <tt>Pacchetti aggiornabili</tt> e qui premiamo "+". Questo marcher per l'installazione tutti i pacchetti aggiornabili :-D
== Risolvere eventuali problemi con delle dipendenze ==
Dopo aver marcato per l'installazione tutti i pacchetti aggiornabili, aptitude ci segnala nella zona blu che c' un pacchetto "errato" cio con problemi di dipendenze. Senza battere ciglio premiamo "b" e leggiamo:
<pre>
<pre>
iB      udev          0.070    0.074
" Running Python 3 by pushing F5
map <f5> :w<CR>:!python3 %<CR>
</pre>
</pre>
dove "B" significa "con errori", e sotto si legge:
<pre>
Alcune dipendenze di udev non sono soddisfatte:
  *udev in conflitto con module-init-tools (< 3.2pre9-1)
</pre>
premiamo invio su udev, e ci appare la schermata con tutte le informazioni su udev stesso, comprese le dipendenze: selezioniamo module-init-tools e premiamo invio. Ora ci appaiono tutte le versioni disponibili di module-init-tools, tra cui vediamo che presente la 3.2pre9-1: non ci resta che selezionarla e marcarla per l'installazione :-D.
Quello che successo semplicemente che nel mio sistema udev in testing, e fino alla versione 0.070 funzionava bene con module-init-tools-3.2pre1-2, che invece in stable. Aggiornando tutto abbiamo marcato per l'installazione il nuovo udev, versione 0.074, che per dipende da module-init-tools >= 3.2pre9-1. Poich questo pacchetto in testing, APT non ha potuto risolvere la dipendenza automaticamente: se un pacchetto in una distribuzione (e APT configurato nel modo giusto) non verr mai passato ad un'altra, a meno che non siamo noi a farlo manualmente.
Si prega di notare che questo comportamento non un bug, ma una cosa voluta: APT ha ricevuto un comando ambiguo e lo segnala generando un errore, proprio come noi ci aspettiamo da lui ;-).
In effetti, i reali colpevoli della generazione dell'errore siamo noi. Infatti, per permettere ad APT di gestire correttamente delle dipendenze in testing, dobbiamo semplicemente usare "testing" come distribuzione predefinita.
Ricordate che abbiamo lanciato aptitude semplicemente con il comando "aptitude"? e ricorderete anche che il mio sistema una sarge (stable). Questo equivale a lanciare aptitude con il comando "aptitude -t stable", da cui il nostro problema.
Se avessimo usato "aptitude -t testing" aptitude avrebbe risolto correttamente la dipendenza, ma attenzione: in questo modo diciamo ad aptitude che testing la nostra release predefinita (che non vero) e lui ci mostrer come aggiornabili tutti i pacchetti che lo sono in testing, cio anche tutti quelli in stable (come peraltro ci aspettiamo che faccia ;-)).
Il fatto che aptitude, per quanto avanzato, ancora non legge il pensiero dell'amministratore, e fa solo il suo mestiere: prende tutte le decisioni ovvie autonomamente, e genera un errore quando non sa cosa decidere.
==Cercare un pacchetto==
Ora supponiamo di voler vedere se in debian c' qualche programma per la gestione dei contenuti, e l'acronimo in inglese "cms". Per fare questo possiamo usare le funzioni di ricerca di aptitude: per prima cosa digitiamo <tt>'''/'''</tt> per la ricerca della stringa "cms" nei nomi dei pacchetti.
Ora per ci viene in mente che un cms non contiene necessariamente la stringa "cms" nel nome, quindi facciamo, con la stessa stringa, una ricerca nelle descrizioni dei pacchetti: digitiamo ancora <tt>'''/'''</tt> e inseriamo "<tt>~dcms</tt>". Aptitude ci mostra il primo risultato della ricerca, per vedere i risultati successivi premiamo <tt>'''n'''</tt>, e per tornare indietro nella lista <tt>'''\'''</tt>.
Per '''L'''imitare la lista dei pacchetti visualizzati possiamo usare il comando <tt>'''l'''</tt>, che si usa allo stesso modo di <tt>'''/'''</tt> ma mostra tutti e soli i pacchetti corrispondenti alla ricerca, organizzati ad albero nel modo che abbiamo gi visto.
=== Ricerca avanzata ===
Aptitude supporta numerose opzioni di dicerca come il precedente <tt>~d</tt> per cercare una stringa nelle descrizioni. La stringa di ricerca pu inoltre essere una [[REGEXP]] (espressione regolare). Queste opzioni possono essere usate indifferentemente da linea di comando (dopo <code>search</code>) che dall'interfaccia grafica (premendo <tt>'''/'''</tt> oppure <tt>'''l'''</tt>).
Di seguito si riporta qualche esempio. fare riferimento alla guida di aptitude citata all'inizio per i dettagli.


Volete sapere quali pacchetti di gnome 2.14 son entrati in etch? Semplice:
alla pressione del tasto F5 verrà eseguito <code>python</code> (o <code>python3</code>) passando come parametro il file corrente (indicato da <code>'''%'''</code>).


  $ aptitude search gnome~V2.14
Se si è soliti usare entrambe le versioni di Python si può pensare di associare l'avvio di ciascun compilatore/interprete a tasti funzione diversi.


Il seguente comando cerca invece i pacchetti che contengono <tt>editor</tt> nella descrizione e che appartengono alla sezione <tt>sound</tt>:
== Autocompletamento e documentazione integrata ==
{{Box|Attenzione|I pacchetti <code>vim-tiny</code> e <code>vim</code> non includono questa funzionalità. Occorre dunque installare uno tra i pacchetti seguenti: <code>vim-nox</code>, <code>vim-gtk</code>, <code>vim-gnome</code> o <code>vim-athena</code>.}}
Dalla versione 7 in Vim è stata inserita una funzione di autocompletamento intelligente (conosciuto anche come ''omnicompletion'')  per i vari linguaggi simile a quella presente in alcuni degli IDE più avanzati.


  $ aptitude search ~deditor~ssound
[[image: Python-gvim-7-omnicompletion.png|thumb|Screenshot della funzione di omnicompletion di Vim 7 con linguaggio di programmazione Python.]]


== Personalizzare la visualizzazione dei pacchetti ==
Per il Python questa funzione permette di completare i nomi delle classi, dei metodi e degli attributi tramite un comodo menu contestuale. Inoltre viene anche visualizzata contemporaneamente la docstring del metodo o della classe che si sta completando.


Con aptitude � possibile personalizzare sia i campi visualizzati nella lista dei pacchetti, sia il raggruppamento in sezioni e sotto-sezioni.
Una immagine vale più di mille parole. Potete notare la funzione di omnicompletion in funzione nello screenshot qui a fianco. Notare come sulla parte superiore della finestra sia apparsa automaticamente la documentazione della classe sulla quale si sta utilizzando l'autocompletamento.


=== Personalizzare il raggruppamento in sezioni ===
Per effettuare l'autocompletamento, quando si è in modalità inserimento basta premere <code>'''Ctrl+x Ctrl+o'''</code>.


Le sezioni nelle quali sono raggruppati i pacchetti quando si avvia Aptitude (e non solo) sono generate dinamicamente da un insieme di regole separate da virgola. &grave; possibile vedere e modificare le regole che generano la vista attuale premendo ''''G''''.
Per spostarsi nel riquadro della finestra occupato dalla documentazione o per chiuderlo si utilizzano i [[VimCS:_Gestione#Finestre|classici comandi di Vim]] per la gestione delle finestre, quali <code>'''CTRL+w w'''</code> e <code>''':close'''</code>.


Le regole vengono elaborate in sequenza dalla prima all'ultima
A volte è anche comodo effettuare un autocompletamento ''non intelligente'', basato sulle parole presenti nel file corrente. Questo autocompletamento si ottiene premendo <code>'''CTRL+n'''</code>. Quest'ultimo metodo può risultare utile per completare nomi di variabili o di funzioni.


Vediamo alcune regole:
== Tips and Tricks ==
Alcuni ulteriori consigli nell'uso di Vim:


; <tt>filter(missing)</tt> : non visualizza i pacchetti che esistono solo nelle dipendenze di un altro pacchetto.
# '''Commentare un blocco di codice'''
#* Premere <code>'''CTRL+v'''</code> e selezionare le righe di codice interessate;
#* premere <code>'''I'''</code> (i maiuscola) e digitare il carattere interessato (solitamente <code>#</code>);
#* premere ESC;
#* spostarsi dalla riga corrente.
# '''Indentare e deindentare un blocco di codice'''
#* Premere <code>'''v'''</code> ed entrare in modalità "visuale linea";
#* selezionare la parte di codice da in/deindentare;
#* premere <code>'''>'''</code> per indentare o <code>'''<'''</code> per deindentare di 1 TAB.


; <tt>status</tt> : Raggruppa i pacchetti in:
:* Installati
:* Non installati
:* Aggiornamenti della sicurezza
:* Aggiornabili
:* Obsoleti
:* Virtuali


; <tt>section[(''mode''[,passthrough])]</tt> : Raggruppa i pacchetti in base alla loro sezione. ''mode'' pu� assumere uno dei seguenti valori:
In alternativa al metodo indicato al punto 1, per commentare un blocco di testo è possibile mappare un tasto qualsiasi che faccia tutto il lavoro "sporco".
 
:; <tt>topdir</tt> : Raggruppa un base alla sezione dell'archivio debian (esempio: ''"main", "contrib", "non-free" ...'').  
:; <tt>subdir</tt> : Raggruppa in base alla sezione logica (esempio: ''"adim", "base", "devel", "gnome", "kde", ecc ...'')
:; <tt>none</tt> : Raggruppa in base delle sezioni formate dalla somma delle  precedenti (esempio: ''"controb/admin", "contrib/devel", "non-free/admin", "non-free/devel").
:; <tt>task</tt> : Crea un albero dei pacchetti raggruppandoli per task.
 
: Se viene usato il secondo parametro opzionale <tt>passthrough</tt> i pacchetti che per qualche motivo non hanno una sezione vengono passati alla regola successiva senza essere inseriti in categorie.
 
All'avvio di aptitude, premendo ''''G'''' si pu� vedere che vengono usate le seguenti regole:


Perché ciò avvenga, basterà aggiungere all'interno del file di configurazione lo snippet:
<pre>
<pre>
filter(missing),task,status,section(subdir,passthruough),section(topdir,passthrough)
" Python comments: # for adding and - for removing
map # :s/^/#/<CR>
map - :s/^#//<CR>
</pre>
</pre>
La semplice digitazione del carattere  <code>'''#'''</code>  farà in modo che il blocco in quel momento selezionato sia commentato in automatico; quella del carattere  <code>'''-'''</code> invece lo decommenterà.


In base a quanto detto la spiegazione di queste regole � semplice: ''visualizza solo i pacchetti reali, crea l'albero dei task, raggruppa i pacchetti per stato, per ogni stato raggruppa in sezioni logiche e all'interno di ogni sezione logica raggruppa in base alla sezione dell'archivio''.
== Conclusioni ==
 
Questi sono solo piccoli suggerimenti per programmare in Python con Vim. Come al solito correzioni, suggerimenti o aggiunte sono ben accetti e anzi incoraggiati.
== Riferimenti ==


* [http://www.luv.asn.au/overheads/aptitude/aptitude-intro.html Aptitude Introduction]: ottima introduzione ad Aptitude (in inglese) che tratta (tra le altre cose) molte pi� opzioni della linea di comando rispetto alla presente guida (per vedere tutte le diapositive cliccare sullo 0 che appare in basso al centro al passaggio del mouse).
== Link ==
* [http://www.vim.org/ Homepage di Vim]
* [http://www.python.org/ Homepage di Python]
* [http://www.vim.org/scripts/script.php?script_id=1542 Sito ufficiale di pythoncomplete.vim]


* [http://people.debian.org/~dburrows/aptitude-doc/en/ '''Aptitude User's Manual''']: completissimo manuale di riferimento di Aptitude (disponibile solo in inglese). Lo stesso manuale si pu� trovare in <tt>/usr/share/doc/aptitude/html/en/index.html</tt> installando il pacchetto <tt>aptitude-doc-en</tt>.
{{Autori
|Autore = [[Utente:TheNoise|~ The Noise]]
|Verificata_da =
:[[Utente:Stemby|Stemby]] 13:08, 23 mar 2015 (CET)
|Numero_revisori = 1
|Estesa_da =
: [[Utente:Stemby|Stemby]] 13:08, 23 mar 2015 (CET)
}}


[[Categoria:Apt]]
[[Categoria:Elaborazione testi]][[Categoria:Programmi da terminale]][[Categoria:Python]]

Versione attuale delle 12:08, 23 mar 2015

Debian-swirl.png Versioni Compatibili

Tutte le versioni supportate di Debian

Introduzione

Questa pagina raccoglie piccoli suggerimenti per sfruttare al meglio Vim e gVim con il linguaggio di programmazione Python.

Syntax Higlight

La prima funzione che generalmente si abilita quando si usa un editor per programmazione è il syntax highlight.

Per abilitarlo in Vim per i vari linguaggi (incluso Python) è sufficiente decommentare in /etc/vim/vimrc la riga:

syntax on

Se invece si volesse abilitare questa funzionalità unicamente per il proprio utente, o se non si disponesse dei privilegi di superutente, si può creare un file ~/.vimrc contenente quella riga che dunque andrà a sovrascrivere il comportamento di default.

Gestire l'indentazione: TAB, spazi e autoindent

In Python è di vitale importanza gestire correttamente l'indentazione dato che (a differenza dei linguaggi free-form come il C) questa è parte integrante della sintassi.

Il Python di per sé riconosce ogni tipo di indentazione (TAB, spazi, o un mix dei due). Nei moderni sistemi il TAB ha tuttavia una larghezza variabile ed impostabile a piacere. Per evitare dunque problemi di interoperabilità tra persone che usano convezioni diverse è universalmente consigliato di usare nei file di codice Python solamente spazi oppure solamente TAB. Anche l'uso esclusivo di TAB può talvolta creare dei problemi di visualizzazione (e quindi difficoltà di lettura) a causa di una diversa larghezza usata. Per tagliare la testa al toro, dunque, il modo più robusto e portabile di programmare in Python è quello di usare soltanto spazi. È possibile impostare qualsiasi editor per programmazione in modo da sostituire automaticamente al TAB un numero di spazi pari alla larghezza dell'indentazione, e ovviamente anche Vim non è da meno. La larghezza per una unità di indentazione usata quasi universalmente in Python, come raccomandato nella PEP 8, è pari ad una larghezza di 4 spazi. Per ricapitolare il nostro scopo è ottenere:

  • sostituzione alla pressione del tasto TAB con un numero equivalente di spazi;
  • larghezza indentazione pari a 4 spazi.

Per ottenere questo comportamento in Vim/gVim si possono decommentare le seguenti righe nel file di configurazione /etc/vim/vimrc:

  if has("autocmd")
    filetype plugin indent on
  endif

ed inserire il seguente codice nello stesso file:

  autocmd FileType python setlocal et sw=4 sts=4 sta tw=79

Il primo abilita l'indentazione automatica per i vari linguaggi di programmazione. In particolare per il Python, se ad esempio dichiariamo una funzione su una riga, andando a capo avremo già il cursore indentato per poter scrivere il corpo della funzione con la giusta indentazione. Stessa cosa vale per i vari if, for, ecc... Questa funzione è utile anche per accorgersi di errori sintattici come la mancanza dei :, poiché la loro assenza fa si che il cursore non venga indentato.

La riga aggiunta associa ai tipi di file Python le seguenti impostazioni:

tabstop oppure ts
larghezza del carattere TAB, quando incontrato nel file. Noi non useremo caratteri TAB, quindi questa impostazione può essere ignorata (e infatti non è riportata nell'esempio precedente). Viene elencata qui solo per chiarezza e completezza.
expandtab oppure et
riempe con spazi le indentazioni generate dalla pressione del tasto TAB.
shiftwidth oppure sw
larghezza di un rientro dell'indentazione automatica. È usato anche per definire la larghezza del rientro che si aggiunge o toglie ad un blocco di testo quando si seleziona (con V) e poi si indenta/deindenta con > o con <.
softtabstop oppure sts
larghezza di un rientro causato dalla pressione di un TAB. Il rientro è creato inserendo spazi se et è settato, altrimenti viene usata una combinazione di spazi e caratteri TAB (questi ultimi hanno larghezza ts).
smarttab oppure sta
in combinazione con le opzioni precedenti questa impostazione permette di cancellare un rientro (4 spazi reali nel nostro caso) con una sola pressione del tasto BS (o BackSpace).
textwidth oppure tw
lunghezza massima del testo inserito. Una riga più lunga viene spezzata dopo uno spazio bianco per stare in questi limiti.

Folding: le piegature nel codice

Una funzione comoda durante la programmazione è la possibilità di ripiegare del codice (ad esempio una funzione o una classe) in modo di avere una visione più compatta del file e facilitare la navigazione.

Questo è possibile in Vim tramite il folding (piegature). Esistono dei plugin per Vim che riconoscono le strutture sintattiche del Python e creano automaticamente le piegature. Tuttavia il metodo illustrato di seguito è ancora più semplice: piegature automatiche in base all'indentazione. Nel caso del Python questo semplice metodo è particolarmente efficace.

Per abilitarlo basta inserire in /etc/vim/vimrc:

set foldmethod=indent

Di seguito sono elencati i principali comandi per gestire le piegature:

zo oppure Spazio
apre la piegature sotto il cursore (un solo livello)
zO
apre la piegature sotto il cursore e ricorsivamente tutte le piegature in essa contenute
zc
chiude la piegatura alla quale appartiene il blocco di codice indicato dal cursore (un solo livello)
zC
chiude la piegatura alla quale appartiene il blocco di codice indicato dal cursore e ricorsivamente tutte le piegature che la contengono
zr
apre tutte le piegature del file corrente di un livello
zR
apre completamente le piegature contenute nel file corrente (tutti i livelli)
zm
chiude tutte le piegature del file corrente di un livello
zM
chiude completamente le piegature contenute nel file corrente (tutti i livelli)

Eseguire Python da Vim

Vim possiede caratteristiche avanzate che permettono di impostare i compilatori da usare per ogni linguaggio e il metodo di esecuzione del make.

Nel caso del Python propongo una soluzione quick and dirty che associa ad un tasto l'esecuzione dello script.

Aggiungendo nell'ormai famoso /etc/vim/vimrc

" Running Python by pushing F5
map <f5> :w<CR>:!python %<CR>

oppure, nel caso in cui si usi Python 3,

" Running Python 3 by pushing F5
map <f5> :w<CR>:!python3 %<CR>

alla pressione del tasto F5 verrà eseguito python (o python3) passando come parametro il file corrente (indicato da %).

Se si è soliti usare entrambe le versioni di Python si può pensare di associare l'avvio di ciascun compilatore/interprete a tasti funzione diversi.

Autocompletamento e documentazione integrata

Info.png Attenzione
I pacchetti vim-tiny e vim non includono questa funzionalità. Occorre dunque installare uno tra i pacchetti seguenti: vim-nox, vim-gtk, vim-gnome o vim-athena.

Dalla versione 7 in Vim è stata inserita una funzione di autocompletamento intelligente (conosciuto anche come omnicompletion) per i vari linguaggi simile a quella presente in alcuni degli IDE più avanzati.

Screenshot della funzione di omnicompletion di Vim 7 con linguaggio di programmazione Python.

Per il Python questa funzione permette di completare i nomi delle classi, dei metodi e degli attributi tramite un comodo menu contestuale. Inoltre viene anche visualizzata contemporaneamente la docstring del metodo o della classe che si sta completando.

Una immagine vale più di mille parole. Potete notare la funzione di omnicompletion in funzione nello screenshot qui a fianco. Notare come sulla parte superiore della finestra sia apparsa automaticamente la documentazione della classe sulla quale si sta utilizzando l'autocompletamento.

Per effettuare l'autocompletamento, quando si è in modalità inserimento basta premere Ctrl+x Ctrl+o.

Per spostarsi nel riquadro della finestra occupato dalla documentazione o per chiuderlo si utilizzano i classici comandi di Vim per la gestione delle finestre, quali CTRL+w w e :close.

A volte è anche comodo effettuare un autocompletamento non intelligente, basato sulle parole presenti nel file corrente. Questo autocompletamento si ottiene premendo CTRL+n. Quest'ultimo metodo può risultare utile per completare nomi di variabili o di funzioni.

Tips and Tricks

Alcuni ulteriori consigli nell'uso di Vim:

  1. Commentare un blocco di codice
    • Premere CTRL+v e selezionare le righe di codice interessate;
    • premere I (i maiuscola) e digitare il carattere interessato (solitamente #);
    • premere ESC;
    • spostarsi dalla riga corrente.
  2. Indentare e deindentare un blocco di codice
    • Premere v ed entrare in modalità "visuale linea";
    • selezionare la parte di codice da in/deindentare;
    • premere > per indentare o < per deindentare di 1 TAB.


In alternativa al metodo indicato al punto 1, per commentare un blocco di testo è possibile mappare un tasto qualsiasi che faccia tutto il lavoro "sporco".

Perché ciò avvenga, basterà aggiungere all'interno del file di configurazione lo snippet:

" Python comments: # for adding and - for removing
map # :s/^/#/<CR>
map - :s/^#//<CR>

La semplice digitazione del carattere # farà in modo che il blocco in quel momento selezionato sia commentato in automatico; quella del carattere - invece lo decommenterà.

Conclusioni

Questi sono solo piccoli suggerimenti per programmare in Python con Vim. Come al solito correzioni, suggerimenti o aggiunte sono ben accetti e anzi incoraggiati.

Link




Guida scritta da: ~ The Noise Swirl-auth40.png Debianized 40%
Estesa da:
Stemby 13:08, 23 mar 2015 (CET)
Verificata da:
Stemby 13:08, 23 mar 2015 (CET)

Verificare ed estendere la guida | Cos'è una guida Debianized