Un modo semplice per allineare il testo in colonne è quello di utilizzare Tabular o Align plugin. Se nessuno di questi è a portata di mano, è possibile utilizzare il seguente comando un po 'complicato (e un po' ingombrante) ma perfettamente funzionante (per il caso il caso in questione). 1,2
:let m=0|g/\ze -- /let m=max([m,searchpos(@/,'c')[1]])
:%s//\=repeat(' ',m-col('.'))
Scopo del primo comando è quello di determinare la larghezza della colonna sinistra del separatore (che presumo essere --
qui). La larghezza è calcolata come un massimo delle lunghezze del testo nella prima colonna tra tutte le righe. Il comando :global
viene utilizzato per enumerare le righe contenenti il separatore (le altre linee non richiedono l'allineamento). L'atomo \ze
situato subito dopo l'inizio del modello, imposta la fine della corrispondenza nella stessa posizione in cui inizia (vedere :help \ze
). Modifica delle confini della partita non influisce il comando modo :global
opere, il modello è scritto in modo tale solo per soddisfare le esigenze del successivo comando sostituzione: Dal momento che questi due comandi potrebbero condividere lo stesso modello, si può essere omesso nel secondo.
Il comando eseguito sulle linee abbinate,
:let m=max([m,searchpos(@/,'c')[1]])
chiama la funzione searchpos()
per cercare il modello utilizzato nel genitore :global
di comando, e per ottenere la posizione della colonna della partita. Il modello è denominato @/
utilizzando l'ultimo registro del modello di ricerca (vedere :help "/
). Ciò si avvantaggia del fatto che il comando :global
aggiorna il registro /
non appena inizia l'esecuzione. Il flag c
passato come secondo argomento nella chiamata searchpos()
consente la gara del primo carattere di una riga (:global
posizioni del cursore proprio all'inizio del linea per eseguire un comando via), perché potrebbe essere che non è un testo a sinistra del separatore. La funzione searchpos()
restituisce un elenco, il primo elemento di è il numero di riga della posizione corrispondente e il secondo è la posizione della colonna.Se il comando viene eseguito su una linea, la riga corrisponde allo schema del comando contenente :global
. Siccome lo searchpos()
è per cercare lo stesso motivo, c'è sicuramente una corrispondenza su quella linea. Pertanto, solo la colonna che inizia la corrispondenza è interessata, quindi ottiene estratto dall'elenco di ritorno mediante l'indice [1]
. Questa stessa posizione è uguale alla larghezza del testo nella prima colonna della riga, più uno. Quindi, m
è impostato al massimo del suo valore corrente e di quella posizione della colonna.
Il secondo comando,
:%s//\=repeat(' ',m-col('.'))
pastiglie prima occorrenza del separatore su tutte le righe che contengono essa, con il numero di spazi che manca di rendere il testo prima del separatore prendere m
caratteri, meno uno. Questo comando è un sostituzione globale sostituendo un intervallo vuoto proprio prima del separatore (vedere il commento sul comando :global
sopra) con il risultato della valutazione della dell'espressione (vedi :help sub-replace-\=
)
repeat(' ',m-col('.'))
I repeat()
ripetizioni funzionali il suo primo argomento (come stringa) il numero di volte indicato nel secondo argomento. Poiché su ogni sostituzione il cursore è spostato all'inizio della corrispondenza del modello, m-col('.')
corrisponde esattamente al numero di spazi necessari per spostare il separatore verso destra per allineare le colonne (col('.')
restituisce la posizione corrente della colonna del cursore).
seguito è una versione di una riga di questa coppia di comandi.
:let m=0|exe'g/\ze -- /let m=max([m,searchpos(@/,"c")[1]])'|%s//\=repeat(' ',m-col('.'))
Nelle precedenti revisioni della risposta ai comandi utilizzati per essere segue.
:let p=[0]|%s/^\ze\(.*\) -- /\=map(p,'max([v:val,len(submatch(1))+1])')[1:0]/
:exe'%s/\ze\%<'.p[0].'c -- /\=repeat(" ",'.p[0].'-col("."))'
Coloro che sono interessati a questi particolari comandi possono trovare dettagliate descrizione della storia di modifiche.
possibile duplicato di [Come inserire spazi fino alla colonna X per allineare elementi in colonne?] (Http://stackoverflow.com/questions/6154306/how-to-insert-spaces-up-to-column- x-to-line-up-things-in-columns) – DocMax