2013-07-25 9 views
5

Supponiamo che io sono un file (a capo indicati come^n):Come normalizzare gli spazi bianchi per il blocco del testo in vim?

aaaa^n 
         bbbb^n 
cccc^n 

C'è un semplice comando per riempire gli spazi bianchi per la parte più a destra del blocco (probabilmente utilizzando una selezione visuale); Vedo spesso domande circa la rimozione di spazi vuoti, ma in questo caso voglio gli spazi restanti normato al carattere più lunga non-spazi nel blocco, come di seguito:

aaaa      ^n 
         bbbb^n 
cccc      ^n 
+1

Un problema (e una risposta) in qualche modo correlato è in [Vim get length of matched line] (http://stackoverflow.com/q/13324093). – glts

+1

Vedere anche la mia domanda: http://stackoverflow.com/questions/10057562/create-virtualedit-block-around-selection – Reman

+0

Ottieni il [plugin tabulare] (https://github.com/godlygeek/tabular). –

risposta

4

esaltante il modo più semplice sarebbe quella di fare

set virtualedit=all 

Andare in alto a sinistra del blocco che si desidera selezionare. Utilizzare una selezione visiva a blocchi (<C-V>) e selezionare le linee desiderate. Quindi premere $ per estendere il blocco visivo fino alla fine della riga.

Poi Yank la selezione con y

Quindi digitare gvp al passato, ciò che si tirò indietro sulla linea è di per sé. (gv riseleziona l'ultimo blocco visivo). Al termine, tutte le linee saranno la lunghezza della linea più lunga + 1.

Il motivo per cui funziona. Quando si utilizza una modifica virtuale, la selezione visiva estende ogni riga alla lunghezza più lunga quando viene inserita nel registro.

Questo aggiungerà uno spazio in più per la fine che è facilmente risolvibile con con :%s/ $//

+1

+1 uso eccellente ''virtualedit = all''. Ho scoperto che funziona alla grande, tranne che aggiunge uno spazio in più alla fine di ogni riga. Facilmente risolto con ':% s /.$//'. –

+0

@PeterRincker yeah Lo stavo notando anche io e stavo cercando un ambiente per liberarmene. – FDinoff

+0

Penso che questo sia dovuto al modo in cui '$' funziona. Va sempre a posto oltre l'ultimo carattere della linea. Vorrei che ci fosse un 'g_' per la modalità di blocco visivo. –

3

si può fare in un solo :substitute, anche se lo fa arrivare un po 'coinvolti:

:'<,'>s/$/\=repeat(' ', max(map(getline(line("'<"),line("'>")),'strdisplaywidth(v:val)'))-strdisplaywidth(getline('.')))/ 

Questo comando si applica alla selezione visiva. Se è necessario un maggiore controllo sull'intervallo, prendere in considerazione il wrapping del sostituto in una funzione che accetta uno range.

Come funziona?

  • \= nella stringa di sostituzione consente di valutare l'espressione: vedi :h sub-replace-expression.

  • La sostituzione è un numero di caratteri dello spazio di riempimento: repeat(' ', ...).

  • Il numero esatto di caratteri spazio è determinata come differenza tra

    • la lunghezza massima linea nella selezione, max(map(getline(start,end), 'strdisplaywidth(v:val)')) e
    • la larghezza della riga corrente, strdisplaywidth(getline('.')).

Nota che strdisplaywidth() non è disponibile in Vims più anziani, ma è necessario per gestire correttamente entrambe le schede e gli spazi nella linea. (Utilizzare strlen() come sostituto economico.)

+0

Questa non è la soluzione migliore, secondo me, ma sono un po 'intimorito da quel comando. – ravron

+1

per un lavoro una volta, questo è un po 'troppo. tuttavia, se questa operazione deve essere eseguita molto spesso, questa potrebbe essere scritta come una funzione o una mappatura per rendere molto facile questo tipo di operazione. solo selezione visuale, quindi premere 'ABC' +1! – Kent

+0

@Kent glts ha scritto una funzione e mappatura, ma poi lo ha rimosso. Controlla la cronologia delle modifiche se vuoi vederlo. – FDinoff

Problemi correlati