Python e Vim: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
(guida estesa e verificata)
 
(49 versioni intermedie di 6 utenti non mostrate)
Riga 1: Riga 1:
==Il superdemone inetd==
{{Versioni compatibili}}
== 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].


===Introduzione===
== Syntax Higlight ==
Inetd ('''Internet Super-Server''') � un [[demone]] che ascolta sulle porte specificate nel suo file di configurazione e fa avviare il relativo servizio nel momento in cui viene fatta una richiesta. Esso controlla tramite dei [[wrapper]] i file '''/etc/hosts.allow''' e '''/etc/hosts.deny''' per verificare che la connessione sia consentita.
La prima funzione che generalmente si abilita quando si usa un editor per programmazione è il ''syntax highlight''.


Viene chiamato superdemone proprio per questa sua funzione di controllo di altri demoni.
Per abilitarlo in Vim per i vari linguaggi (incluso Python) è sufficiente decommentare in <code>/etc/vim/vimrc</code> la riga:


Il vantaggio di usarlo � di ottimizzare le risorse del sistema, avviando il demone che gestisce un determinato servizio solo quando ci sono effettive richieste.
<pre>syntax on</pre>


Sebbene possa essere usato per gestire quasi tutti i servizi � consigliabile farlo solo per quelli a basso e occasionale traffico.
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.


===Installazione===
== Gestire l'indentazione: TAB, spazi e ''autoindent'' ==
Se per qualche motivo il demone inetd non dovesse essere installato � sufficiente installarlo tramite APT. Inoltre consiglio l'installazione dei TCP wrappers:
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.
<pre>$: apt-get install netkit-inetd tcpd</pre>


===Configurazine===
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:
Per prima cosa � necessario modificare i permessi al file '''/etc/inetd.conf''' in modo che solo root abbia accesso:
<pre>$: chmod 600 /etc/inetd.conf</pre>


Ogni riga di '''/etc/inetd.conf''' corrisponde ad un servizio che viene gestito da inetd. Se � commentata con un # il servizio non viene avviato e inetd non mette la relativa porta in listening. Esempio:
* sostituzione alla pressione del tasto TAB con un numero equivalente di spazi;
* larghezza indentazione pari a 4 spazi.


<pre># These are standard services. 
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")
#ftp    stream  tcp  nowait  root  /usr/sbin/tcpd  in.ftpd -l -a 
     filetype plugin indent on
#telnet stream  tcp  nowait  root  /usr/sbin/tcpd  in.telnetd
   endif</pre>
#
# Shell, login, exec, comsat and talk are BSD protocols. 
#shell  stream  tcp    nowait  root    /usr/sbin/tcpd  in.rshd 
#login  stream  tcp    nowait  root    /usr/sbin/tcpd  in.rlogind  
#exec  stream  tcp     nowait  root    /usr/sbin/tcpd  in.rexecd 
#comsat dgram   udp    wait    root    /usr/sbin/tcpd  in.comsat 
#talk  dgram  udp    wait    root    /usr/sbin/tcpd  in.talkd 
#ntalk  dgram  udp    wait    root    /usr/sbin/tcpd  in.ntalkd 
#dtalk  stream  tcp    waut    nobody  /usr/sbin/tcpd  in.dtalkd</pre>


Il formato tipico di ogni riga � il seguente:
ed inserire il seguente codice nello stesso file:
<pre>  autocmd FileType python setlocal et sw=4 sts=4 sta tw=79</pre>


<pre>service type protocol wait user server cmdline</pre>
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.


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


Un esempio pratico di una riga presente in '''/etc/inetd.conf''':
;<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.
<pre>ftp stream tcp nowait root /usr/sbin/in.ftpd �l


ftp: nome del servizio
;<code>expandtab</code> oppure <code>et</code>: riempe con spazi le indentazioni generate dalla pressione del tasto TAB.
stream: indica il tipo
tcp: indica il protocollo
nowait: indica se deve attendere
user: indica l�utente che ha il privilegio di accesso
server: indica dove si trova il programma
cmdline:indica il nome dell�eseguibile e eventuali flag</pre>


Inoltre inetd si appoggia su un altro file di configurazione dei servizi:
;<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 '''<'''.


<pre>/etc/services
;<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>).
File che assegna un nome di servizio alla relativa porta.
Viene usato anche da altri programmi come file di riferimento.</pre>


Se si vogliono utilizzare i tcpwrapper per limitare l'accesso al servizio la riga sopra diventa:
;<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''').
<pre>ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd �l</pre>


Nelle distribuzioni Linux, solitamente inetd � gi� configurato per supportare i tcp wrappers.
;<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.


===TCP wrappers===
== Folding: le piegature nel codice ==
I tcp wrapper '''TCPD''', sviluppati dall'olandese Wietse Venema, sono un layer software che permette il controllo e il filtro degli accessi a servizi del sistema, tipicamente gestiti con inetd.
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.


In pratica da una configurazione:
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.


<pre>client -----> inetd -----> servizio</pre>
Per abilitarlo basta inserire in <code>/etc/vim/vimrc</code>:


Si passa ad una configurazione:
<pre>set foldmethod=indent</pre>


<pre>client -----> inetd -----> TCPD -----> servizio</pre>
Di seguito sono elencati i principali comandi per gestire le piegature:


Nella nuova configurazione i tcpwrappers possono limitare l'accesso al servizio secondo criteri configurabili ed hanno funzionalit� anti-spoofing e anti tcp seguence guessing. La configurazione dei tcp wrappers si fa essenzialmente in due file.
;<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)


Questo file permette di specificare quali servizi abilitare e da quali indirizzi IP:
== Eseguire Python da Vim ==
<pre>/etc/hosts.allow</pre>
Vim possiede caratteristiche avanzate che permettono di impostare i compilatori da usare per ogni linguaggio e il metodo di esecuzione del <code>make</code>.


Questo file permette di specificare come limitare l'accesso a specifici servizi:
Nel caso del Python propongo una soluzione ''quick and dirty'' che associa ad un tasto l'esecuzione dello script.
<pre>/etc/hosts.deny</pre>


===Comandi utili===
Aggiungendo nell'ormai famoso <code>/etc/vim/vimrc</code>
Per avviare, riavviare, fermare il servizio inetd:
<pre>$: /etc/rc.d/init.d/inetd start/stop/restart</pre>


===Configurazioni utili===
<pre>
Nega l'accesso a tutti i client e controlla che ip - nome.host corrispondano:
" Running Python by pushing F5
<pre>File da applicare: /etc/hosts.deny
map <f5> :w<CR>:!python %<CR>
ALL:ALL@ALL,PARANOID</pre>
</pre>


Consente l'accesso a tutti i client e controlla che ip - nome.host corrispondano:
oppure, nel caso in cui si usi Python 3,
<pre>File da applicare: /etc/hosts.allow
ALL: LOCAL 192.168.1.0/255.255.255.0</pre>


Permette l'accesso SSH all'host prova.it corrispondente all'IP 10.0.0.1
<pre>
<pre>File da applicare: /etc/hosts.allow
" Running Python 3 by pushing F5
sshd: 10.0.0.1 prova.it</pre>
map <f5> :w<CR>:!python3 %<CR>
</pre>


Manda una mail all'indirizzo specificato admin_mail ogni qualvolta qualcuno si connette attraverso il servizio telnet, indicando l'indirizzo del client (%a) e l'utente (%u), la lista di questi parametri � contenuta nella man page hosts_access.
alla pressione del tasto F5 verrà eseguito <code>python</code> (o <code>python3</code>) passando come parametro il file corrente (indicato da <code>'''%'''</code>).
<pre>File da applicare: /etc/hosts.allow
in.telnetd : ALL@ALL : spawn ( /bin/mail -s "Connessione telnet da: %a %u" admin_mail ) & </pre>


==Da inetd a Xinetd==
Se si è soliti usare entrambe le versioni di Python si può pensare di associare l'avvio di ciascun compilatore/interprete a tasti funzione diversi.
===Differenze===
A differenza del precedessore, xinetd (e'''x'''tended inetd):


:*Limita o regola l'accesso a determinati servizi senza ricorrere al Tcp Wrapper;
== Autocompletamento e documentazione integrata ==
:*Offre un sistema di logging indipendente da syslog;
{{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>.}}
:*Permette di limitare l'accesso ai servizi in determinate ore della giornata;
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.
:*Supporta il protocollo Ipv6;
:*Utilizza vari meccanismi che mitigano l'impatto di un attacco DOS.


===File di configurazione===
[[image: Python-gvim-7-omnicompletion.png|thumb|Screenshot della funzione di omnicompletion di Vim 7 con linguaggio di programmazione Python.]]
La configurazione del demone e dei servizi pu� essere suddivisa in pi� file non compatibili con i vecchi file di configurazione del demone inetd. Le directory contenenti i file di configurazione sono leggermente cambiate:
<pre>/etc/xinetd.conf
File di configurazione del demone


/etc/xinetd.d/*
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.
Directory che contiene i singoli file dei servizi offerti da xinetd</pre>


Il file di configurazione di xinetd � un file di testo che indica i servizi gestiti da xinetd. Contiene delle sezioni, ognuna delle quali identifica un servizio, con la seguente sintassi:
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.
<pre>service service_name
{
    attribute assign_op [value] [value] [...]
    [...]
}</pre>


Dove i seguenti attributi indicano:
Per effettuare l'autocompletamento, quando si è in modalità inserimento basta premere <code>'''Ctrl+x Ctrl+o'''</code>.
:* '''service_name'''  � l�indicazione di un servizio gestito da xinetd;
:* '''attribute'''  indica un attributo relativo al servizio service_name;
:* '''assign_op'''  � un operatore di assegnamento, e pu� essere = (specifica l�unico valore dell�attributo), += (aggiunge un valore all�attributo) o -= (rimuove un valore dall�attributo).


===Esempi di configurazione di Xinetd===
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>.
Di seguito sono riportati alcuni esempi pratici e semplici di un file di configurazione '''/etc/xinetd.conf''':
<pre>service shell
          {
                socket_type        = stream
                wait                = no
                user                = root
                instances          = UNLIMITED
                server              = /usr/etc/in.rshd
                log_on_success      += HOST RECORD
          }


service ftp                                                             
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.
          {
                socket_type        = stream
                wait                = no
                nice                = 10
                user                = root
                server              = /usr/etc/in.ftpd
                server_args        = -l
                instances          = 4
                log_on_success      += DURATION HOST USERID
                access_times        = 2:00-9:00 12:00-24:00
          }</pre>


Per una guida dettagliata di ogni singolo parametro � possibile consultare il '''man''' una volta installato xinetd. Xinetd � un demone molto flessibile e tramite il suo file di configurazione � possibile specificare decine e decine di opzioni.
== Tips and Tricks ==
Alcuni ulteriori consigli nell'uso di Vim:


===Opzioni di Xinetd===
# '''Commentare un blocco di codice'''
Le opzioni che possono essere utilizzate per la modalit� di funzionamento di xinetd sono le seguenti:
#* Premere <code>'''CTRL+v'''</code> e selezionare le righe di codice interessate;
:* '''-d''' abilita la modalit� di debug;
#* premere <code>'''I'''</code> (i maiuscola) e digitare il carattere interessato (solitamente <code>#</code>);
:* '''-syslog syslog_facility''' imposta la facility relativa al system log44 secondo quanto specificato da syslog_facility;
#* premere ESC;
:* '''-filelog logfile'''' indica di redirigere il log degli eventi di xinetd nel file logfile;
#* spostarsi dalla riga corrente.
:* '''-f config_file''' indica il file di configurazione da considerare secondo quanto specificato da config_file (default /etc/xinetd.conf);
# '''Indentare e deindentare un blocco di codice'''
:* '''-pidfile pid_file''' indica di scrivere nel file pid_file il PID del processo lanciato;
#* Premere <code>'''v'''</code> ed entrare in modalità "visuale linea";
:* '''-stayalive''' indica di rimanere in esecuzione anche se nel file di configurazione non � stato specificato nessun servizio;
#* selezionare la parte di codice da in/deindentare;
:* '''-limit proc_limit''' imposta il numero massimo di processi che xinetd pu� lanciare secondo quanto specificato da proc_limit;
#* premere <code>'''>'''</code> per indentare o <code>'''<'''</code> per deindentare di 1 TAB.
:* '''-logprocs limit''' imposta il numero massimo di daemon che possono essere lanciati in esecuzione per ogni utente, secondo quanto specificato da limit;
:* '''-version''' visualizza la versione di xinetd;
:* '''-inetd_compat''' indica di considerare anche il file di configurazione '''/etc/inetd.conf''' subito dopo '''/etc/xinetd.conf''';
:* '''-cc interval''' indica di controllare un controllo periodico del proprio stato ogni interval secondi;


Il processo xinetd effettua le operazioni elencate in corrispondenza dei seguenti segnali:


:*'''SIGHUP''' rilegge il file di configurazione e termina l�esecuzione dei daemon relativi a servizi non pi� attivi (secondo quanto specificato nel file di configurazione);
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".
:* '''SIGQUIT''' termina la sua esecuzione;
:* '''SIGTERM''' termina l�esecuzione di tutti i daemon prima di terminare anche la sua esecuzione;
:* '''SIGUSR1''' scrive il suo stato interno (dump) nel file '''/var/run/xinetd.dump''';
:* '''SIGIOT''' controlla la consistenza delle sue strutture dati, visualizzando quindi un messaggio relativo.


Autore: [[Utente:Net deity|Net deity]]
Perché ciò avvenga, basterà aggiungere all'interno del file di configurazione lo snippet:
[[Categoria:Server]][[Categoria:Networking]]
<pre>
" Python comments: # for adding and - for removing
map # :s/^/#/<CR>
map - :s/^#//<CR>
</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à.
 
== 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 ==
* [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]
 
{{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: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