A capo automatico in Vim (preservando il rientro)


92

Stavo proprio guardando questo post che descrive come racchiudere intere parole in vim. La soluzione accettata era questa:

:set formatoptions=l
:set lbr

Che accetta questo testo (le tabulazioni sono mostrate come \ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will wr|ap here                            
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Questo realizza un comportamento come questo (le schede sono mostrate come \ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|wrap here                              |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Tuttavia, vorrei ridefinire questa funzione. Vorrei che la riga a capo avesse lo stesso numero di tabulazioni davanti che la riga sopra ha più uno. Cioè:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|\t\t\twrap here                        |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Qualche idea?


34
+1 per l'impegno profuso per rendere la domanda più chiara possibile.
Jeffrey Jose

Vuoi che il testo vada a capo in modo morbido sul bordo della finestra o che vada a capo quando la linea raggiunge una certa lunghezza? Penso che tu voglia un ritorno a capo (dove una nuova riga è inserita nel tuo testo dopo la parola "will"), ma è difficile da dire dai tuoi esempi.
Bill Odom

@ Bill, sono principalmente interessato al softwrapping, ma sarebbe accettabile anche una soluzione hardwrapping.
sixtyfootersdude

1
La funzionalità che desideri non è attualmente integrata in Vim. C'è una patch che si avvicina, tuttavia: groups.google.com/group/vim_dev/web/vim-patches (è # 15, "Rientro corretto delle righe a capo").
Bill Odom

Correlati: VimCasts ha avuto un bell'episodio sull'utilizzo di utilità unix esterne per gestire questo problema: vimcasts.org/e/18
Damien Wilson

Risposte:


18

La patch breakindent ha quello che stai cercando. L'ho applicato con successo usando le istruzioni trovate in questo thread:

Patch Vim con la patch breakindent su OS X con Homebrew

In particolare, la formula Homebrew di echristopherson.

So che questo thread è vecchio ma è popolare su Google e mi sono imbattuto più volte nel tentativo di trovare una soluzione.

EDIT: questa patch è ora inclusa con vim come patch 7.4.338. Vedi: https://retracile.net/blog/2014/07/18/18.00

Su Yosemite (Mac OS X), ho usato il comando di snowbound con hombrew:

brew install macvim --with-features=huge --override-system-vim --HEAD 

la patch non sembra funzionare con l'ultimo macvim su homebrew? @ Exit42 come hai fatto a farlo funzionare?
neve il

nvm. Ho compilato macvim con homebrew bleeding edgebrew install macvim --with-features=huge --override-system-vim --HEAD
snowbound

1
Vedi la mia risposta qui sotto: stackoverflow.com/questions/2828174/… Non c'è bisogno di una patch nelle versioni più recenti di vim.
JoshuaD

26

Questo non ha funzionato quando la domanda è stata inizialmente posta, ma dal 25 giugno 2014 funzionerà. (Supponendo che tu aggiorni il tuo vim a una versione più recente di quella data)

Aggiungi al tuo .vimrc:

" Indents word-wrapped lines as much as the 'parent' line
set breakindent
" Ensures word-wrap does not split words
set formatoptions=l
set lbr

E questo è tutto!

-

Alcune persone (me compreso) condividono un singolo .vimrc su più computer. In tal caso, è importante che questa linea sia robusta (per evitare fastidiosi messaggi di errore). Questo è un po 'meglio:

if has("patch-7.4.354")
    " Indents word-wrapped lines as much as the 'parent' line
    set breakindent
    " Ensures word-wrap does not split words
    set formatoptions=l
    set lbr
endif

In questo modo, se utilizzi una versione precedente di vim, non ricevi un messaggio di errore.


È interessante notare che funziona sul 7.4 vim del mio cygwin ma non sul 7.4 vim del mio unbuntu. Immagino che debba diventare un po 'più diffuso, ma presto vedrà l'adozione universale.
JoshuaD

1
Funziona in Vim 7.4 @ ArchLinux.
Andy Mikhaylenko

1
Puoi usare questo test invece:if has("patch-7.4.354")
Lawrence Kesteloot

Questo non risponde alla domanda riguardante l'osservazione di OP: lo stesso numero di schede (...) più una . A proposito, è molto importante anche a mio parere, spesso potresti voler mantenere un rientro aggiuntivo e spostare otticamente i segmenti avvolti a destra (elenchi ben organizzati, note, ecc.);
sanguinosa

8

Il meglio che otterrai è l' showbreakopzione che metterà una stringa fissa davanti a ogni riga racchiusa (io uso set showbreak=...).


@AlexanderBird Secondo :help 'showbreak', no, non puoi - showbreakè solo una stringa.
Rory O'Kane

4

Sono d'accordo con la risposta che dice che "showbreak" è l'opzione migliore. Showbreak tipicamente non ti permette di inserire caratteri non stampabili (es. Spazi o tabulazioni) nella stringa showbreak, così come tipicamente usato ti darà solo un indicatore lungo il margine sinistro, cioè nessun rientro reale. Questo non è eccezionale, dal momento che l'obiettivo principale di OP, penso, è quello di dare alle linee avvolte un rientro per evitare che ingombrino l'area del margine sinistro e sembrino linee proprie.

Quindi un modo per aggiungere un (brutto) rientro usando showbreak è usare solo molti caratteri, .eg, ": set showbreak => --------------->". Ciò si traduce in qualcosa che assomiglia a questo:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|>--------------->wrap here             |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Un'alternativa migliore potrebbe essere quella di utilizzare caratteri di spazio unificatori (supponendo che la tua istanza di Vim sia abilitata per unicode), ognuno dei quali può essere inserito nella stringa showbreak usando la sequenza di tasti ctrl-v, 160. In questo modo puoi inserire una stringa showbreak che è vuota sul lato sinistro e sembra essere un vero rientro. Ad esempio, ": set showbreak =.......... >>" dove ogni '.' nel comando è in realtà un carattere spazio unificatore immesso premendo ctrl-V, 160. In questo modo ti ritroverai con un involucro ben rientrato, come questo:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|            >>wrap here                |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Non hai ancora la possibilità di variare il livello di rientro in base al rientro della riga precedente, ma almeno ottieni un rientro pulito delle linee avvolte senza un sacco di confusione visiva lungo il margine sinistro della finestra. Potrebbe esserci ancora confusione se il rientro di una riga a capo è inferiore a quello dell'inizio di una riga effettiva, ma questo potrebbe forse essere evitato rendendo il "rientro" dello showbreak abbastanza grande (cioè maggiore di qualsiasi rientro comunemente trovato nel codice ) ma ancora abbastanza piccolo da fornire spazio sufficiente per il wrapping leggibile del testo. Per molti usi penso che un rientro showbreak di 40 o 50 spazi lo farebbe abbastanza bene.


7
È possibile inserire spazi showbreak da loro fuga: :set showbreak=\ \ \ \ . Tuttavia, non funziona ancora per le schede.
Bill Odom
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.