2012-06-14 11 views
23

La domanda di seguito è rilevante quando si desidera copiare il testo da Vim a qualcos'altro, ad esempio un browser web.Involucro del testo in vim

Di solito ho l'opzione tw=80 quando modifica file, in particolare file LaTeX. Tuttavia, supponiamo di voler comporre un'email in Vim con l'opzione tw=80 e quindi voglio copiarla e incollarla su un browser web. Prima di copiare e incollare, voglio scartare il testo in modo che non ci sia un'interruzione di riga ogni 80 caratteri o giù di lì. Ho provato tw=0 e poi gq, ma questo avvolge semplicemente il testo alla larghezza predefinita di 80 caratteri. La mia domanda è, come faccio a scartare il testo, in modo che ogni paragrafo della mia email appaia come una singola riga? C'è un comando facile per quello?

risposta

39

Va all'inizio di voi paragrafo e immettere:

v i p J

Per tutto il documento combinarlo con norma:

:%norm vipJ 

Questo comando scatterà solo i paragrafi. Immagino che questo sia il comportamento che vuoi.

+0

Grazie! Suppongo che questo sia il metodo più semplice disponibile allora? Nulla che faccia questo per l'intero documento in una volta sola presumo? – Ray

+2

@Ray Ho modificato la mia risposta e aggiunto il comando da eseguire per l'intero documento. –

+1

È preferibile utilizzare il comando ': normal' con'! '-specifier in questo caso per evitare conflitti con i mapping personalizzati. –

10

Poiché unire le righe di paragrafo utilizzando i comandi in modalità Normale è già coperto da un'altra risposta, consideriamo di risolvere lo stesso problema mediante i comandi Ex orientati alla linea .

Supponiamo che il cursore si trovi sulla prima riga di un paragrafo. Quindi a scartalo, si può semplicemente unire le seguenti righe successive fino all'ultima riga di in quel paragrafo. Un modo conveniente per farlo è di eseguire il comando progettato esattamente per lo scopo. Per definire l'intervallo di linee per il comando su operare su, oltre alla linea di partenza ovvia che è quella attuale, è necessario per specificare la linea di fine. Può essere trovato utilizzando il modello corrispondente alla fine di un paragrafo, ovvero un carattere di fine riga seguito da una riga vuota. Così, traducendo detta definizione di sintassi Ex-comando, si ottiene :

:,-/\n$/j 

Per tutti i paragrafi da scartare, esegue questo comando sulla prima linea di ogni paragrafo. Uno strumento utile per saltare attraverso di loro ripetendo una determinata sequenza di azioni è il comando :global. Come :global esegue la scansione delle righe da dall'alto in basso, la prima riga di un paragrafo è solo la prima riga non vuota tra quelle non elaborate. Questa osservazione ci dà il comando

:g/./,-/\n$/j 

che è più efficiente delle sue controparti in modalità Normale.

+0

C'è un piccolo bug in questo comando: se si ha un paragrafo di una riga viene incollato all'inizio del prossimo paragrafo. –

+1

@ Omar: ottima cattura, grazie! La risposta è stata aggiornata per risolvere questo caso. –

+0

Lo stavo facendo come nella risposta di @ fatih, ma per qualche ragione che unisce paragrafi molto brevi insieme, quindi sono venuto qui alla ricerca di alternative e questo funziona alla grande, grazie! – dbmrq

4

Il problema con :%norm vipJ è che se si hanno righe consecutive più brevi di 80 caratteri, si uniranno a loro anche se sono separate da una riga vuota.Per esempio il seguente esempio:

# Title 1 

## Title 2 

diventerà:

# Title 1 ## Title 2 

Con la risposta di ib, il problema è con le liste:

- item1 
- item2 

diventa:

- item1 - item2 

Grazie a this forum post Ho scoperto un altro metodo per raggiungere tale obiettivo, che ho avvolto in una funzione che funziona molto meglio per me, dal momento che non fa nulla di tutto ciò:

function! SoftWrap() 
    let s:old_fo = &formatoptions 
    let s:old_tw = &textwidth 
    set fo= 
    set tw=999999 " works for paragraphs up to 12k lines 
    normal gggqG 
    let &fo = s:old_fo 
    let &tw = s:old_tw 
endfunction 

Modifica: Aggiornato il metodo, perché ho capito che non stava lavorando una configurazione Linux. Rimuovere le righe contenenti fo se questa versione più recente non funziona con MacVim (non ho modo di testare).