Vim for Programmers - Seconda Parte
Da MelugWiki.
by emitrax_at_gmail_dot_com
Indice |
Introduzione
Se avete letto la prima parte, dovreste avere un'infarinatura generale sul come funziona VIM. Adesso vedremo altre funzioni molto utili come ad esempio la ricerca, la sostituzione e quant'altro mi passa per la testa! ;-)
Muoversi velocemente con VIM
Ci sono alcuni comandi molto utili che permettono di spostarsi all'interno di un file in maniera molto rapida! Vediamone qualcuno...
Per andare ad inizio riga si usa lo 0 (zero)
0
Fine riga il dollaro
$
Per andare alla riga 312, ad esempio, dalla modalita comandi scrivete 312 seguito da G (maiuscola)
312G
Oppure
:312<invio>
Se invece volete aprire un file e spostarvi direttamente alla riga 312
vim nomefile.c +312
Et voilà! Siamo alla riga 312! Comodo no?! Soprattutto quando gcc non è molto d'accordo sulla nostra sintassi! ;-)
Per sapere di quante righe è il file , dalla modalita comandi premete ctrl+g ed in basso a sinistra avrete la risposta! Oppure se volete che le righe vengano numerate, potete settare VIM affinche vi numeri le righe con
:set number
Per non numerare le righe
:set nonumber
Continuando con gli spostamenti, per andare all'ultima riga si usa $, quindi
$G
Oppure
:$
Se poi invece vogliamo aprire un file e dire a VIM di posizionare il cursore sulla linea che contiene una determinata stringa basta fare
vi mioprogramma.c +/nomefunzione
Indovinate su quale riga si è posizionato il cursore una volta aperto il file?! Provatelo!
Per spostarsi invece dalla definizione di una funziona ad un altra in maniera molto veloce si usano i comandi ]] e [[ Prossima funzione
]]
Funzione precedente
[[
Ricerca
Per effettuare le ricerche, dalla modalità comandi, si usano i comandi / (forward slash) e ? seguiti dalla stringa che state cercando. Ad esempio
/main
Cerchera la stringa main dalla posizione del cursore in giu, fino alla fine del file per poi ricominciare dall'inizio del file.
?main
Farà il contrario, cioè dalla posizione del cursore all'inizio del file, per poi continuare dalla fine del file all'insù fino alla posizione del cursore. Personalmente credo che la ricerca con lo / sia piu che sufficiente. Nel caso sono presenti piu istanze della stringa main, potete passare alla successiva tramite il tasto n
/stringa n (per vedere la successiva)
Per vedere l'istanza precedente invece
N
Spesso le istanze trovate vengono evidenziate, e ciò risulta essere davvero noisoso! Per disabilitare l'opzione usate il comando
:set nohlsearch
Dove hl sta per highlight. Ve lo dico perche cosi vi viene piu facile ricordare poi il comando. ;-)
Infine, un altro modo per cercare una stringa e il comando * .Basta infatti posizionarsi sulla stringa che volete cercare, premete * in modalita comandi, e con n e N potrete cercare le successive istanza di quella stringa. Comodo per vedere dove viene usata una variabile ad esempio.
*
Sostituzione
Vediamo adesso quali sono i comandi piu utili per effettuare le sostituzioni
Il piu utile in assoluto, secondo me, è il comando che vi permette di cambiare tutte le occorrenze di una determinata stringa con una nuova.
:1,$ s/stringaDaCambiare/nuovaStringa/g
Allora... 1,$ dice a VIM di cambiare tutte le istanze dalla riga numero 1 all'ultima. s indica si sostituire tutte le istanze di "stringaDaCambiare" con "nuovaStringa" e g serve ad indicare a VIM di sostituire tutte le istanze nelle righe e non solo la prima per riga. Infatti se aveste omesso la g, VIM avrebbe sostituito solo la prima istanza per riga. Se volete che si vi venga chiesta conferma prima di effettuare una sostituzione basta aggiungere la c (confirme) dopo la g
:1,$ s/stringaDaCambiare/nuovaStringa/gc
Se invece volete cambiare solo la prima istanza della riga corrente
:s/vecchio/nuovo
Per tutte le istanze della riga corrente aggiungete la g. Per cambiare invece solo le istanze dalla riga n alla riga m
:n,m s/nuovo/vecchio/gc
Credo abbiate capito come funzioni il gioco! :-)
Se invece vogliamo spingerci fino all'extreme :-) e vogliamo cambiare una determinata istanza in tutti i file che abbiamo aperto (vedi sezione Piu file con VIM), usiamo il comando
:bufdo %s/vecchio/nuovo/g
Chi sa fare di meglio?!?!
Se invece dovete semplicemente sostituire un carattere, posizionatevi su quel carattere in modalita comandi ed usante il comando r (replace). Se ad esempio avete scritto maan al posto di main, spostavi sulla seconda a e usate il comando
ri
Questo sostituira il carattere a con i. Se invece dovete sostituire un intera parola
cw
Iniziate a scrivere e vedrete che VIM prima cancellera la parola e poi passera in modalita inserimento per permettervi di scrivere. E' facile intuire che possiamo fare lo stesso per quante parole vogliamo, tipo 3
c3w
Oppure fino a fine riga o inizio riga
c$ c0
Eseguire comandi UNIX da VIM
Volete sapere in che directory vi trovate senza uscire da VIM?! Oppure volete eseguire un qualsiasi altro comando senza uscire da VIM?! Ok... nessun problema!
:!comandolinux
Ad esempio
:!ls
Piu finestre con VIM
Adesso arriva il vero divertimento! Aprite un qualsiasi sorgente con VIM. Adesso immaginiamo che non vi ricordate com'era fatta esattamente una determinata struttura che sta in un altro header ed avete bisogno di aprire il file ma non volete uscire dal corrente... perche non aprire un altra finestra con VIM!? Dalla modalita comandi premete ctrl+w+n ,dove w sta per window e n sta per new (almeno credo!).
ctrl+w+n
Et voilà! Adesso aprite l'altro header nella nuova finestra, usando il comando e (edit)
:e .
I due punti iniziali e il punto finale non sono un errore! Dovete metterli. Nella nuova finestra vedrete listati le directory ed i sorgenti presenti nella directory corrente. Con i tasti direzionali scegliete il file di vostro interesse ed apritelo con invio. Avrete adesso due file aperti contemporaneamente! Per passare da una finestra all'altra basta usare il comando ctrl+w+w
ctrl+w+w
Per chiuderne una basta passare ad essa con ctrl+w+w ed uscire dal file che state editando semplicemente con il comando :q
Potete aprire quante finestre volete con il comando ctrl+w+n, ma personalmente credo che 2 siano sufficienti, anche perche poi non si capisce piu niente. Per passare da una finestra all'altra basta usare sempre la combinazinoe ctrl+w+w.
Divertente per esempio potrebbe essere, chattare con irssi in una finestra mentre programmate nell'altra! :-)
vim miofile.c ctrl+w+n :!irssi
Simpatico vero?!?!
Piu file con VIM
Se invece volete aprire un altro file, ma non volete ne aprire un altra finestra ne chiudere il file corrente, potete semplicemente usare il comando e.
:e nuovofile.c
Oppure
:e .
Per selezionare il file.
Il file corrente non verra chiuso, ma continuera a rimanere aperto. Potete aprire quanti file volete. Per sapere quanti file avete aperto usate il comando
:ls
ATTENZIONE: non confondetelo con :!ls Questo è un output del comando :ls sul mio computer
:ls 1 "motionDetectorMain.h" line 1 3 "~/programming/cv/Motion Tracking 0.0.1/motionDetectorMain.cpp" line 223 4 %a "~/programming/cv/Motion Tracking 0.0.1/Makefile" line 21 Hit ENTER or type command to continue
Una volta visualizzati i file aperti, potete tornare ad editare uno di essi con
:e #n
dove n è il numero associato a quel file dall'output di ls. Ad esempio se volevo editare il file motionDetectorMain.cpp avrei dovuto fare
:e #3
Poiche 3 è il numero associato ad esso(prima colonna). Per chiudere invece un file, potete usare il comando bd
:bd 3
Ovviamente al posto di 3 dovete mettere il numero del file listato da ls che volete chiudere. Comodo no?!?!
Bookmarks in un sorgente
Un altra potente caratteristica di VIM è la possibilità di "marcare" una determinata riga di codice e tornarci da qualsiasi file e/o riga di codice ci troviamo in un attimo! Per marcare una riga, basta posizionarsi sulla riga con il cursore ed usare il comando m seguito dalla lettera con la quale si vuole marcare la riga. Se per esempio vogliamo marcare la riga 314 con la lettera a facciamo
:314 ma
Se poi vogliamo invece marcare la riga con il main con la lettera b facciamo
/main ESC mb
Per poi tornare a quella riga, si usa l'apice singolo seguito dalla lettera che abbiamo usato per marcare la riga. Esempio, per tornare alla riga con il main
'b
Per listare tutti i bookmarks che abbiamo usato, utilizziamo il comando
:marks