Avvolgimento morbido a 80 caratteri in Vim in una finestra di larghezza arbitraria


126

Voglio usare la funzionalità di avvolgimento morbido di Vim ( :set wrap) per racchiudere un po 'di codice a 80 caratteri, indipendentemente dalla mia larghezza effettiva della finestra.

Non sono ancora riuscito a trovare un modo per farlo - tutto il soft wrapping sembra legato alla larghezza della finestra

  • textwidthe wrapmarginsono entrambi per il wrapping (inseriscono i caratteri di nuova riga nel file)
  • suddivisione verticale in più finestre e utilizzo :vertical resize 80(possibilmente con :set breakat=per consentire interruzioni su qualsiasi personaggio) su uno di questi tipi di lavori (anche se è un po 'hacker), ma interruzioni quando si usano :set numbercome i numeri di riga occupano un numero variabile di colonne (a seconda sulla lunghezza del file) e questi fanno parte degli 80.

C'è un modo per farlo in vim? Non sembra promettente, secondo altre fonti .

In questo momento la mia approssimazione è solo quella di avere /^.\{80}\zs.\+la mia ricerca predefinita, quindi è almeno evidenziata. Ho pensato di aggiungere un :syntaxelemento per esso, ma si è rotto quando si è sovrapposto ad altri elementi di sintassi, quindi ho lasciato perdere quell'idea.


In realtà, come hai impostato una ricerca predefinita?
thinman

Risposte:


37

Potresti

  • impostare una larghezza minima grande per la colonna dei numeri di riga tramite :set numberwidth=6e
  • quindi è possibile ridimensionare la finestra con :set columns=86(o con il mouse) alla dimensione corretta.

Se modifichi un file con un milione di righe, potresti avere problemi, ma è improbabile. In questo modo stai sprecando anche 6 colonne di immobili sullo schermo. Quindi ci sono ancora tutti i tipi di problemi.

Puoi evidenziare oltre l'80a colonna usando :matchcome dice qui e qui .

Oltre a ciò non riesco a vedere alcun modo per farlo. Sembra che sarebbe una bella caratteristica però.


Sfortunatamente vim non mantiene l'impostazione delle colonne se la finestra viene ridimensionata. Questo porta a una sfortunata situazione con i gestori di finestre di piastrellatura in cui non c'è un buon modo per avvolgere delicatamente 80 colonne se la finestra è troppo ampia.
gravitazione

Funziona, ma non è appiccicoso. Immagino che il prossimo passo sia impostare un autocmd per mantenere le colonne alla nuova dimensione desiderata per i tipi di file desiderati.
xer0x,

1
Questa è la risposta giusta in quanto conferma che non puoi farlo. E sono sicuro di non essere l'unico a non voler ridimensionare la finestra del mio terminale solo per questo. Voglio molta più larghezza per usi non vim.
Sridhar Sarnobat,

20

Prova questo:

set columns=80
autocmd VimResized * if (&columns > 80) | set columns=80 | endif
set wrap
set linebreak
set showbreak=+++

Puoi rimuovere il if (&columns > 80) |se vuoi sempre 80 colonne.


Sul mio terminale iTerm, questo rende la finestra più piccola. Non sono sicuro che si tratti di un problema con il mio ambiente (vedo che stai facendo qualcosa con il ridimensionamento automatico), ma per il resto non è auspicabile. Grazie per il suggerimento però.
Sridhar Sarnobat,

L'autocmd ha funzionato perfettamente per me (usando il terminale guake).
mzcarlos,

Funziona come un incantesimo con Tmux + NeoVim in Alacritty.
Meh

16

Non ho una soluzione per il soft wrap, ma per quanto riguarda la marcatura di una colonna, a partire da Vim 7.3 (rilasciato il 15-08-2010) :set colorcolumn=80evidenzieremo la colonna 80. Il colore dipenderà dal tuo file di sintassi.

Vedi Vim 80 Layout colonne preoccupazioni , :h colorcolumn.


Le virgolette non sono URL validi, quindi ha senso. Il nome di ancoraggio non deve contenere caratteri URL non validi, SO non dovrebbe correggere errori di altri sviluppatori del sito.
Shadow Wizard is Ear For You,

1
Shadow Wizard si riferisce a una precedente revisione della mia risposta in cui mi chiedo come inserire virgolette singole negli URL usando Markdown. Quindi ib ha suggerito di usare% 27, che ha funzionato. Grazie, ib.
ftvs,

Di recente ho scoperto come evidenziare solo le colonne oltre 80 ~:let w:eighty_column_match = matchadd('ColorColumn', '\%81v.\+', 100)
rampion

La colorwidthcosa è utile per altri motivi, quindi sono contento che tu l'abbia pubblicato.
Sridhar Sarnobat,

2

Ci hai provato 'linebreak'?

        *'linebreak'* *'lbr'* *'nolinebreak'* *'nolbr'*
  'linebreak' 'lbr' boolean (default off)
        local to window
        {not in Vi}
        {not available when compiled without the  |+linebreak|
        feature}
If on Vim will wrap long lines at a character in 'breakat' rather
than at the last character that fits on the screen.  Unlike
'wrapmargin' and 'textwidth', this does not insert <EOL>s in the file,
it only affects the way the file is displayed, not its contents.  The
value of 'showbreak' is used to put in front of wrapped lines.
This option is not used when the 'wrap' option is off or 'list' is on.
Note that <Tab> characters after an <EOL> are mostly not displayed
with the right amount of white space.

3
Hmm ... ma breakatè solo uno schema (non una lunghezza), quindi non vedo come potrei usarlo per forzare un avvolgimento morbido a 80 ....
rampion

Hmmm, mi chiedo se è possibile creare una regex che corrisponda a parole la cui lunghezza totale (più spazi bianchi in mezzo) sono inferiori o uguali a n caratteri.
Shane Creighton-Young,

@ ShaneCreighton-Young: ^.{,80}\bfarebbe per le persone che usano le schede soft / espandi. Nota che è perl regex, non vim regex.
Mark K Cowan,

0

Non esiste un buon modo per farlo. Siamo in grado di incidere un ripiego setlocal softwrapcon autocmdse modifichiamo @eborisch risposta. Se ridimensioniamo ogni volta che inseriamo un buffer e ridimensioniamo a una determinata lunghezza quando softwrapviene impostata la variabile locale , otteniamo il comportamento desiderato.

Supponiamo di voler avvolgere delicatamente 80 colonne, possiamo scrivere quanto segue .vimrc.

augroup softwrap
    autocmd VimResized * if (exists('b:softwrap') && &columns > 80) | set columns=80 | endif
    autocmd BufEnter * set columns=999
augroup END

Per attivare la modalità per un determinato buffer, utilizzare i seguenti comandi:

let b:softwrap=1
set columns=80

Questo trasforma semplicemente i miei file in incomprensibili.
Suuuehgi,
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.