Quando si guarda il codice scritto da altri può capitare di non capire nulla dell’indentazione a causa delle differenti impostazioni di tab (c’è chi lo tiene a 8 come me, chi lo mette a 4, 3, ecc.).
Poichè il carattere di tab viene visualizzato in vim a seconda delle impostazioni locali, se sono state utilizzate delle combinazioni di spazi e tab nel codice il risultato potrebbe essere assai confuso.
Dunque, può diventare utile trasformare tutti i tab in whitespace nel momento della digitazione. Per questo c’è
:set expandtab
che converte i tab inseriti in Insert mode nel giusto numero di spazi.
:set tabstop=8
:set softtabstop=8
Queste due impostazioni indicano la lunghezza del tab in fase di inserimento.
Tabstop, per la precisione, indica proprio il numero di spazi attribuiti al tab. Cambiarlo significa cambiare la visualizzazione corrente di tutti i tab del codice.
:set shiftwidth=8
Questa voce imposta lo spazio permesso all’indentazione (automatica o meno).
:retab
Rimpiazza tutti i tab del file. In combo con expandtab è rapido e utile.
Un articolozzo su come convertire tab in spazi.
Grazie a cosimo, larsen e oha.
Larsen
In vim si può cancellare comodamente il testo fra due delimitatori (es: “.*”, <.*>, {.*}) usando:
d(elete)i(nner)<simbolo>
Esempio: di” cancella tutto quello che è fra due ” intorno al cursore sulla stessa riga.
La quick reference relativa.
[Edit 20/10/2011] Un articolo relativo la manipolazione degli oggetti in vim.
Cosimo
Un setting molto utile può essere lo scrolloff
:set so=<n>
che permette lo scrolling del testo n righe prima che il cursore raggiunga il bordo – molto utile quando si vuole avere del contorno.
Oha
invece ha fatto questo
match ExtraWhitespace /s+$| +zet/
autocmd BufWinEnter * match ExtraWhitespace /s+$| +zet/
autocmd InsertEnter * match ExtraWhitespace /s+%#@ autocmd InsertLeave * match ExtraWhitespace /s+$| +zet/
autocmd BufWinLeave * call clearmatches()
per evidenziare gli spazi che precedono tab o a fine riga.
Guardicchiando questo tutorial (simpatico, ma basico) ho scoperto quella gran ganzata delle abbreviazioni in vim.
Le abbreviazioni servono per generare una stringa da una keyword in Insert mode, Replace mode o Command-line mode.
In breve:
:abbreviate mybox Linux idrogeno 2.6.34.1-H-100710-2 #2 SMP Sun Jul 11 16:54:46 CEST 2010 x86_64 GNU/Linux
farà sì che scrivendo mybox in Insert mode e pigiando un tasto non carattere (ie: spazio, Enter, ecc., anche Ctrl+j) la keyword venga sostituita dalla stringa che segue.
Un autocompletamento assai caruccio.
Questo si andrà ad aggiungere al paio di mappature che avevo messo nel .vimrc.
map <F3> <Esc>i#!/usr/bin/perl<Esc>o<Esc>ouse strict;<Esc>ouse warnings;<Esc>o
map <F4> <Esc>o#include <><Esc>i
Tutte le volte che devo scrivere una regex un po’ complicata con vim esco di testa.
In effetti scrivere regular expression fa spesso uscire di testa, ma con vim è un massacro perchè è leggermente diverso dallo standard che sono abituato ad affrontare col perl. Sic.
Qui c’è un bello schema riassuntivo: Vim Regular Expressions
Se per caso servisse sistemare dei tag uno per riga, si potrebbe usare una cosa del genere:
Dovendo scrivere un po’ di codice xml, mi sono chiesto se ViM avrebbe potuto venirmi in aiuto.
Il plugin xml.vim ha rappresentato la risposta.
Per “installarlo” è bastato mettere il file in ~/.vim/plugin/ e far leggere a ViM un file xml.
Per togliere righe vuote da semplici file di testo con script in vari linguaggi ci sono tantissimi modi.
Nel caso si stia manipolando il file con vim, c’è un modo più veloce sfruttando le feature notevoli dell’editor in questione.
Vim permette di utilizzare un comando chiamato global per replicare un comportamento definito.
La sintassi è:
: [intervallo]global/[matching]/[comando]
Essenzialmente definito l’intervallo di righe su cui agire, global effettua un comando secondo le occorrenze definite dal matching.
Nel caso specifico si vogliano cancellare le righe vuote in tutto il file, la stringa sarà la seguente:
: %g/^$/.d
Dove % indica tutte le righe del file, g sta per global, ^$ è la sintassi della regex per individuare le righe che non contengono nulla, .d indica di cancellare nel punto individuato.
Nel caso non lo sapeste, i peccati capitali esistono anche nell’IT.
Cupidigia o, per i meno aulici, avidità, o per gli anglofoni, greediness.
Gli operatori delle regexp sono greedy. E’ un dato di fatto.
Se prendiamo una riga tipica e html’osa come la seguente:
<span>Questa riga <b>è orgogliosamente</b> taggata a random.</span>
avremo la prova che la regexp è avida.
Un pattern infatti come /<.*>/ match’erà tutti gli elementi che
- partono con un <,
- comprendono un numero qualunque (*) di qualsiasi carattere (.),
- fino ad arrivare al più estremo >.
Questa è la cosa interessante: quel pattern match’a tutta la riga, non solo il primo tag.
<span>Questa riga <b>è orgogliosamente</b> taggata a random.</span>
E questo perché gli operatori delle regexp (ie: *) sono avidi, cioè cercano le corrispondenze su quanto più testo è possibile (ie: fino all’ultimo >)!
Dunque, che si fa se si vuole avere un pattern più ragionevole, magari solo e precisamente sui tag?
Semplice, bisogna spiegare a * di non essere così goloso. ![]()
Gli operatori (nelle regexp di perl) si rendono non-greedy grazie a ? (attenzione: ? applicato ad un operatore alla sua sinistra è diverso dall’operatore ? utilizzato come rimpiazzo di un carattere).
Una dicitura corretta del pattern è /<.*?>/, che porterà al seguente evidenziamento:
<span>Questa riga <b>è orgogliosamente</b> taggata a random.</span>
Purtroppo per fatti suoi, il magnifico editor VIM utilizza un modo alternativo per de-greedy’zzare gli operatori (e in generale per le regexp). Nello specifico in VIM la sintassi è /<.\{-}>/ . L’operatore *? del perl è rimpiazzato da un poco leggibile \{-}.
Ulteriori info riguardo le regexp di vim le ho trovate qua: http://www.geocities.com/volontir/ (parte 4.3).