Bedenken hinsichtlich des Spaltenlayouts von Vim 80

417

Die Art und Weise, wie ich in Vim eine 80-Spalten-Anzeige mache, scheint falsch zu sein : set columns=80. Manchmal auch set textwidth, aber ich möchte in der Lage sein, Leitungsüberlauf mit der set columnsAlternative zu sehen und zu antizipieren .

Dies hat einige unglückliche Nebenwirkungen:

  1. Ich kann nicht set numberaus Angst, zwischen Dateien mit unterschiedlichen Reihenfolgen von Zeilennummern aufzuteilen. dh <100 Zeilendateien und> = 100 Zeilendateien erfordern set columnsaufgrund der zusätzlichen Spalte, die für die Anzeige zusätzlicher Ziffern verwendet wird, zwei unterschiedliche Werte.
  2. Ich starte auch neue (g) Vim-Sitzungen, anstatt Fenster vertikal zu teilen. Dies liegt daran vsplit, dass ich set columnsjedes Mal gezwungen bin, ein Fenster zu öffnen oder zu schließen, sodass das Starten einer neuen Sitzung weniger mühsam ist.

Wie gehen Sie mit der 80-Zeichen-Anzeige um, wenn Sie möchten set numbers, vertikal teilen usw.?

cdleary
quelle
60
In vielen Kreisen wird es als guter Codestil angesehen. In Pythons Style Guide (PEP8) werden beispielsweise 79 Zeichenzeilen empfohlen: python.org/dev/peps/pep-0008
cdleary
4
Es ist kein absolutes "Sie müssen 80 Zeichenzeilen haben", aber es macht es angenehmer, auf einigen Systemen zu lesen, wie zum Beispiel jeder konsolenbasierten Anwendung, die nicht in einem GUI-Konsolenfenster ausgeführt wird, dessen Größe geändert werden kann.
Matthew Scharley
47
@davr: Erstens ist es einfacher zu lesen. Einige Studien legen nahe, dass eine kurze Zeilenlänge (76 Zeichen pro Zeile) am angenehmsten und am schnellsten online zu lesen ist. Wissen Sie das: Plötzlich sind Ihre Augen beim Lesen auf der falschen Linie? Dies passiert selten mit 80 Zeichen. Zweitens bearbeite oder differenziere ich häufig visuell mit zwei Dateien nebeneinander auf meinem 1600 Pixel breiten Monitor. Dies funktioniert nur gut, wenn die Datei keine Zeilen mit mehr als 80 Zeichen enthält. Daher formatiere ich oft lange Zeilen neu, bevor ich effizient arbeiten kann.
Nalply
25
@davr Es ist unglaublich nützlich, um mehrere Dateien nebeneinander zu bearbeiten.
Aehlke
2
Ich mache sowohl im C / C ++ - als auch im JS-Code weit weniger Fehler, da ich eine Zeilenbreite von 80 Zeichen (aus dem Kernel-Codierungsstil) übernommen habe. Ich überlaufe es gelegentlich von einem Paar, aber selten ...
Mark K Cowan

Antworten:

586

Ich habe dies in meiner .vimrc eingerichtet:

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

Dies hebt den Hintergrund in einem subtilen Rot für Text hervor, der die 80-Spalten-Grenze überschreitet (jedenfalls subtil im GUI-Modus - im Terminal-Modus ist dies weniger der Fall).

Simon Howard
quelle
3
Großartige Idee! Ich habe es in "ctermbg = darkred" und "guibg = # FFD9D9" geändert, um meinen Anforderungen besser zu entsprechen (heller Hintergrund in gvim und dunkler im cterm-Modus).
HS.
10
Ich denke, eine subtile Korrektur ist /\%81v.\+/ - aus irgendeinem Grund hebt das. * Orte hervor, an denen keine Zeichen existieren.
cdleary
14
Ich denke, diese Zeile ist etwas besser für den Match-Regex: match OverLength /\%>80v.\+/ Dies hebt das Zeichen 'Zeilenende' nicht hervor und ist auch intuitiver, da Sie die Zahl einfach auf das einstellen, was Sie wollen die Zeilenlänge soll nicht +1 sein.
David Terei
8
Aus irgendeinem Grund funktioniert es nur im ersten geöffneten Puffer für mich (erstes Fenster der ersten Registerkarte) in meinem vim ...
lajarre
3
Überprüfen Sie stackoverflow.com/a/10993757/9822, ob diese Lösung nur in Ihrem ersten Puffer funktioniert.
Jesse Vogt
769

Ab Version 7.3 können Sie set colorcolumn=80( set cc=80kurz) verwenden.

Da frühere Versionen dies nicht unterstützen, verwende ich .vimrcstattdessen:

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

Siehe auch die Online-Dokumentation zur colorcolumnOption .

Jeremy W. Sherman
quelle
26
Sie können den Wert von 'colorcolumn' sogar automatisch auf 'textwidth' stützen, indem Sie Folgendes festlegen: Setzen Sie cc = + 1
greywh
1
hat ("colorcolumn") bei mir nicht funktioniert. Ich musste stattdessen exist ("& colorcolumn") verwenden.
SpoonMeiser
5
Sehr schön, außer dass vim <7.1.40 Matchadd nicht unterstützt.
Greg Jandl
19
Sie können auch die Farbe der Spalte mithighlight ColorColumn ctermbg=7
null_radix
2
Die Dokumentation für diese Option ist unter vimdoc.sourceforge.net/htmldoc/options.html#%27colorcolumn%27
JohnTESlade
54

Kürzere Art:

match ErrorMsg '\%>80v.\+'
Maksim Vi.
quelle
8
Ich mag das wirklich, weil es meinen Puffer nicht mit einer langen vertikalen Linie verschmutzt! (Y)
Ionică Bizău
ErrorMsgist ein highlight-group. In Vim gibt es viele Standard-Hervorhebungsgruppen, die Sie basierend auf der für diesen Fall gewünschten Farbcodierung verwenden können.
Crisron
49

Ich bevorzuge:

highlight ColorColumn ctermbg=gray
set colorcolumn=80
wieczorek1990
quelle
Ich mag diesen. Ich habe Schwarz statt Grau verwendet und es war subtiler, da mein Hintergrund fast schwarz ist, aber nicht ganz.
Isopycnal Oscillation
30

Die Antwort von Simon Howard ist großartig. Aber /\%81v.\+/nicht zu Highlight Registerkarten , die Spalte 81 nicht überschreiten. Also habe ich eine kleine Änderung vorgenommen, basierend auf den Dingen, die ich im VIM-Wiki gefunden habe, und der Auswahl der Farben von HS oben:

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

Und jetzt wird VIM alles hervorheben, was Spalte 80 überschreitet.

Z.Zen
quelle
2
Vielleicht möchten Sie guifg=whiteam Ende dort hinzufügen .
Dan Bechard
17

Geben Sie hier die Bildbeschreibung ein

Minimalistischer, nicht übertriebener Ansatz. Nur das 79. Zeichen von zu langen Zeilen wird hervorgehoben. Es überwindet einige häufig auftretende Probleme: Arbeitet an neuen Fenstern, überlaufende Wörter werden richtig hervorgehoben.

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

Hinweis: Beachten Sie, dass FileType scala,javadies auf Scala- und Java-Quelldateien beschränkt ist. Sie werden dies wahrscheinlich anpassen wollen. Wenn Sie es weglassen würden, würde es auf allen Dateitypen funktionieren.

Dominykas Mostauskis
quelle
Warum hast du ein hinzugefügt FileType scala,java? (arbeitet nicht für mich)
Dorian
1
@Dorian beschränkt dies auf Scala- und Java-Dateitypen, da dies die Dateitypen waren, an denen ich zu der Zeit gearbeitet habe. Ich habe es versäumt, das zu erwähnen. Antwort aktualisieren.
Dominykas Mostauskis
Welche Schriftart verwenden Sie im Screenshot? Ich finde es sehr angenehm für das Auge.
Turm
@ Idigas: Einverstanden, und ich denke, vielleicht war Comic Sans eine schlechte Wahl, als ich PuTTY ursprünglich eingerichtet habe :)
Mark K Cowan
Ich konnte das Snippet in dieser Antwort nicht in Vim 7.4 zum Laufen bringen. (Ich habe auch den FileType-Filter entfernt.)
Mnebuerquo
13

Sie können auch eine Linie ziehen, um das Limit von 80 zu sehen:

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

Ergebnis:

Geben Sie hier die Bildbeschreibung ein

0x8BADF00D
quelle
13

Eine gute Möglichkeit, nur das erste Zeichen zu markieren, das die angegebenen Grenzen überschreitet:

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

Aus Damian Conways Vortrag .

Shanded
quelle
7

Neuere Versionen von vim erlauben einen :set numberwidth=xWert, der die Breite der Zeilennummernanzeige festlegt. Ich benutze Falten usw. nicht wirklich, also würde ich davon nichts wissen. Das Zeichnen einer dünnen vertikalen Linie liegt jedoch außerhalb der Möglichkeiten einer Konsolenanwendung. GVim kann dies zulassen (ich benutze es nicht, kann es dort also nicht kommentieren).

Matthew Scharley
quelle
5

Ich befürchte, dass Sie die Menge der Lösungen eingeschränkt haben, die Sie mit der Nullmenge belassen.

Die Verwendung :set textwidth=80behebt alle von Ihnen erwähnten Probleme, außer dass Sie das bevorstehende Zeilenlimit nicht leicht erkennen können. Wenn du:set ruler tun, aktivieren Sie die Anzeige der x- und y-Position in der Statusleiste, anhand derer Sie sehen können, in welcher Spalte Sie sich befinden.

Abgesehen davon bin ich mir nicht sicher, was ich dir sagen soll. Es ist eine Schande, die Zahlenspalte zu verlieren, die Spalte zu falten und zu teilen, nur weil Sie müssen :set columns=80.

Lucas Oman
quelle
Ja, ich hatte Angst davor ... Ich hatte gehofft, dass es einen versteckten Weg geben würde, eine dünne vertikale Linie zu zeichnen, wie in grafisch orientierten Editoren.
CDLeary
5

Sie können dies versuchen:

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

Dadurch werden in jedem Puffer zwei Markierungen festgelegt, eine für Zeichen in den 8 Spalten vor der &textwidthEinstellung und eine für Zeichen außerhalb dieser Spalte. Auf diese Weise haben Sie ein gewisses Maß an Vorfreude. Natürlich können Sie es anpassen, um eine andere Breite zu verwenden, wenn Sie mehr oder weniger Vorfreude wünschen (was Sie in Form eines Verlusts der Syntaxhervorhebung in diesen Spalten bezahlen).

Aristoteles Pagaltzis
quelle
3

Wenn man sich die Hilfespalten ansieht, wird man nicht wirklich dazu gebracht, sich damit zu beschäftigen.

In der Konsole wird dies normalerweise durch die Konsoleneinstellung bestimmt (dh es wird automatisch erkannt). In der GUI wird die Breite der GVIM-Fenster bestimmt (und durch diese bestimmt).

Normalerweise lassen Sie Konsolen und Fenstermanager ihre Arbeit erledigen, indem Sie das auskommentieren set columns

Ich bin mir nicht sicher, was Sie unter "Leitungsüberlauf sehen und antizipieren" verstehen. Wenn Sie möchten, dass EOL ungefähr in Spalte 80 eingefügt wird, verwenden Sie entweder set textwidthoder set wrapmargin; Wenn Sie nur Soft Wrap möchten (dh Linie wird gewickelt, aber keine tatsächliche EOL), dann spielen Sie mit set linebreakund set showbreak.

Ding-Yi Chen
quelle
2

Dieser ist außerhalb des linken Feldes, aber es ist eine nette kleine Karte, mit der Sie die Größe Ihrer aktuellen Aufteilung auf 80 Zeichen ändern können, wenn Sie die Zeilennummern aktiviert haben:

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

Sie können dies versuchen, um die Fenstergröße so einzustellen, dass 80 Zeichen tatsächlichen Textes zulässig sind. Dies funktioniert jedoch immer noch nicht mit vertikalen Teilungen.

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

Dies erfordert vim 7+, 7.3 für die relative Nummer.

Mike L.
quelle