Vim 80 problemi di layout di colonna


417

Il mio modo di fare l'indicazione a 80 colonne in Vim sembra corretta: set columns=80. A volte anche io set textwidth, ma voglio essere in grado di vedere e anticipare l'overflow della linea con l' set columnsalternativa.

Questo ha alcuni effetti collaterali sfortunati :

  1. Non posso set numbertemere di dividere tra file che hanno diversi ordini di numeri di riga; vale a dire <100 file di riga e> = 100 file di riga richiederanno due set columnsvalori diversi a causa della colonna aggiuntiva utilizzata per la visualizzazione delle cifre aggiuntive.
  2. Comincio anche nuove sessioni (g) Vim invece di dividere le finestre verticalmente. Questo perché vsplitmi costringe a set columnsogni volta che apro o chiudo un riquadro, quindi l'avvio di una nuova sessione è meno complicato.

Come gestite l'indicazione di 80 caratteri quando volete set numbers, dividere verticalmente, ecc.?


60
È considerato un buon stile di codice in molti ambienti; ad esempio, Python's Style Guide (PEP8) raccomanda 79 righe di caratteri: python.org/dev/peps/pep-0008
cdleary,

4
Non è assolutamente "devi avere 80 righe di caratteri", ma rende più piacevole la lettura su alcuni sistemi, come ad esempio qualsiasi applicazione basata su console che non è in esecuzione all'interno di una finestra della console della GUI che può essere ridimensionata.
Matthew Scharley,

47
@davr: in primo luogo, è più facile da leggere. Alcuni studi suggeriscono che una lunghezza di linea corta (76 caratteri una riga) è più piacevole e più veloce da leggere online. Sai questo: improvvisamente i tuoi occhi sono sulla linea sbagliata durante la lettura? Ciò accade raramente con 80 caratteri. In secondo luogo, spesso modifica o differisco visivamente con due file affiancati sul mio monitor da 1600 pixel di larghezza. Funziona bene solo se il file non ha righe più di 80 caratteri. Quindi spesso riformatto le lunghe file prima di poter lavorare in modo efficiente.
nalply

25
@davr è incredibilmente utile per la modifica di più file fianco a fianco.
aehlke,

2
Faccio molti meno bug sia nel codice C / C ++ che in quello JS da quando ho adottato una larghezza di 80 caratteri (dallo stile di codifica del kernel). Occasionalmente lo trabocco di una coppia, ma raramente ...
Mark K Cowan,

Risposte:


586

Ho impostato questo nel mio .vimrc:

highlight OverLength ctermbg=red ctermfg=white guibg=#592929
match OverLength /\%81v.\+/

Ciò evidenzia lo sfondo in un sottile rosso per il testo che supera il limite di 80 colonne (sottile in modalità GUI, comunque - in modalità terminale è meno).


3
Grande idea! L'ho cambiato in "ctermbg = darkred" e "guibg = # FFD9D9" per adattarsi meglio alle mie esigenze (sfondo chiaro in gvim e scuro in modalità cterm).
HS.

10
Penso che una correzione sottile sia /\%81v.\+/ - per qualche motivo. * Evidenzia i luoghi in cui i personaggi non esistono.
cdleary,

14
Penso che questa linea sia leggermente migliore per il regex della partita: match OverLength /\%>80v.\+/ Questo non evidenzia il carattere di "fine linea" ed è anche più intuitivo poiché imposti il ​​numero su ciò che desideri la lunghezza della linea da essere, non +1.
David Terei,

8
Per qualche motivo funziona solo nel mio buffer aperto per me (prima finestra della prima scheda) nel mio video ...
lajarre

3
Controlla stackoverflow.com/a/10993757/9822 se questa soluzione funziona solo nel tuo primo buffer.
Jesse Vogt,

769

A partire da vim 7.3, è possibile utilizzare set colorcolumn=80( set cc=80in breve).

Poiché le versioni precedenti non supportano questo, i miei .vimrcusi invece:

if exists('+colorcolumn')
  set colorcolumn=80
else
  au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%>80v.\+', -1)
endif

Vedi anche la documentazione online colorcolumnsull'opzione .


26
Puoi anche basare automaticamente il valore di 'colorcolumn' su 'textwidth' con qualcosa del tipo: set cc = + 1
graywh

1
has ("colorcolumn") non ha funzionato per me. Invece ho dovuto usare esiste ("& colorcolumn").
SpoonMeiser,

5
Molto bello, tranne per il fatto che vim <7.1.40 non supporta matchadd.
Greg Jandl,

19
puoi anche cambiare il colore della colonna conhighlight ColorColumn ctermbg=7
null_radix

2
La documentazione per questa opzione è disponibile su vimdoc.sourceforge.net/htmldoc/options.html#%27colorcolumn%27
JohnTESlade,

54

Modo più breve:

match ErrorMsg '\%>80v.\+'

8
Mi piace molto perché non inquina il mio buffer con una lunga linea verticale! (Y)
Ionică Bizău,

ErrorMsgè un highlight-group. Ci sono molti gruppi di evidenziazione predefiniti in Vim che puoi usare in base alla codifica colore che desideri per questo caso.
crisron,

49

Preferisco:

highlight ColorColumn ctermbg=gray
set colorcolumn=80

Mi piace questa. Ho usato il nero anziché il grigio ed è stato più sottile poiché il mio sfondo è quasi nero ma non del tutto.
Oscillazione isopycnal

30

La risposta di Simon Howard è eccezionale. Ma /\%81v.\+/non riesce a evidenziare le schede che superano la colonna 81. Quindi ho fatto una piccola modifica, basandomi sulle cose che ho trovato sul wiki di VIM e sulla scelta dei colori di HS sopra:

highlight OverLength ctermbg=darkred ctermfg=white guibg=#FFD9D9
match OverLength /\%>80v.\+/

E ora VIM evidenzierà tutto ciò che supera la colonna 80.


2
Potrebbe voler aggiungere guifg=whitealla fine lì.
Dan Bechard,

17

inserisci qui la descrizione dell'immagine

Approccio minimalista, non esagerato. Viene evidenziato solo il 79 ° carattere di linee troppo lunghe. Supera alcuni problemi comuni: funziona su nuove finestre, le parole traboccanti sono evidenziate correttamente.

augroup collumnLimit
  autocmd!
  autocmd BufEnter,WinEnter,FileType scala,java
        \ highlight CollumnLimit ctermbg=DarkGrey guibg=DarkGrey
  let collumnLimit = 79 " feel free to customize
  let pattern =
        \ '\%<' . (collumnLimit+1) . 'v.\%>' . collumnLimit . 'v'
  autocmd BufEnter,WinEnter,FileType scala,java
        \ let w:m1=matchadd('CollumnLimit', pattern, -1)
augroup END

Nota: notare che FileType scala,javaciò limita questo ai file sorgente Scala e Java. Probabilmente vorrai personalizzare questo. Se lo omettessi, funzionerebbe su tutti i tipi di file.


Perché hai aggiunto un FileType scala,java? (non funziona per me)
Dorian,

1
@Dorian limita questo ai tipi di file Scala e Java, perché quelli erano i tipi di file su cui stavo lavorando in quel momento. Ho trascurato di menzionarlo. Aggiornamento della risposta.
Dominykas Mostauskis,

Che tipo di carattere stai usando nello screenshot? Lo trovo molto piacevole alla vista.
Torre del

@Idigas: D'accordo, e penso che forse Comic Sans potrebbe essere stata una cattiva scelta quando ho originariamente creato PuTTY :)
Mark K Cowan,

Non sono riuscito a ottenere lo snippet in questa risposta per lavorare in Vim 7.4. (Ho rimosso anche il filtro FileType.)
Mnebuerquo

13

Puoi anche tracciare una linea per vedere il limite 80:

let &colorcolumn=join(range(81,999),",")
let &colorcolumn="80,".join(range(400,999),",")

Risultato:

inserisci qui la descrizione dell'immagine


13

Un bel modo di contrassegnare solo il primo carattere che esce dai limiti specificati:

highlight ColorColumn ctermbg=magenta "set to whatever you like
call matchadd('ColorColumn', '\%81v', 100) "set column nr

Dal discorso di Damian Conway .


7

Le versioni più recenti di vim consentono un :set numberwidth=xvalore, che imposta la larghezza della visualizzazione del numero di riga. Non uso davvero la piegatura ecc., Quindi non lo saprei. Tracciare una sottile linea verticale è al di là delle capacità di un'applicazione console. GVim può consentire questo (non lo uso, quindi non posso commentare lì).


5

Temo che tu abbia messo dei vincoli sull'insieme di soluzioni che, bene, ti lasciano con l'insieme nullo.

L'uso :set textwidth=80risolverà tutti i problemi che hai citato, tranne per il fatto che non riesci a vedere facilmente il limite di linea che si presenta. In :set rulertal caso , abiliterai la visualizzazione della posizione x, y sulla barra di stato, che puoi utilizzare per vedere in quale colonna ti trovi.

A parte questo, non sono sicuro di cosa dirti. È un peccato perdere la colonna numerica, piegare la colonna e si divide solo perché è necessario :set columns=80.


Sì, ne avevo paura ... Speravo che ci fosse un modo nascosto per disegnare una sottile linea verticale come in editor più orientati alla grafica.
cdleary,

5

Puoi provare questo:

au BufWinEnter * if &textwidth > 8
\ | let w:m1=matchadd('MatchParen', printf('\%%<%dv.\%%>%dv', &textwidth+1, &textwidth-8), -1)
\ | let w:m2=matchadd('ErrorMsg', printf('\%%>%dv.\+', &textwidth), -1)
\ | endif

Ciò imposterà due punti salienti in ogni buffer, uno per i caratteri nelle 8 colonne prima di qualsiasi cosa tu &textwidthabbia impostato e uno per i caratteri oltre quella colonna. In questo modo hai un certo grado di anticipazione. Ovviamente puoi modificarlo per usare una larghezza diversa se vuoi più o meno anticipazioni (che paghi sotto forma di perdita di evidenziazione della sintassi in quelle colonne).


3

Bene, guardando le colonne: help, non è davvero fatto per scherzare.

Nella console, di solito è determinato dall'impostazione della console (ovvero viene rilevata automaticamente); nella GUI, determina (ed è determinato da) la larghezza delle finestre di gvim.

Quindi normalmente lasci che console e window manager facciano il loro lavoro commentando il set columns

Non sono sicuro di cosa intendi per "vedere e anticipare l'overflow della linea". Se si desidera inserire EOL all'incirca nella colonna 80, utilizzare set textwidtho set wrapmargin; se vuoi solo un avvolgimento morbido (cioè la linea è chiusa, ma nessuna EOL effettiva), allora gioca con set linebreake set showbreak.


2

questo è fuori dal campo di sinistra ma è una bella piccola mappa per ridimensionare la tua divisione attuale a 80 caratteri se hai i numeri di riga su:

" make window 80 + some for numbers wide  
noremap <Leader>w :let @w=float2nr(log10(line("$")))+82\|:vertical resize <c-r>w<cr> 

1

Puoi provare questo per impostare la dimensione della finestra in modo da consentire 80 caratteri di testo reale. Tuttavia, ciò non funziona con le divisioni verticali.

let &co=80 + &foldcolumn + (&number || &relativenumber ? &numberwidth : 0)

Ciò richiede vim 7+, 7.3 per il numero relativo.

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.