Vim for Programmers - Seconda Parte

Da MelugWiki.

Jump to: navigation, search

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
Personal tools