Vim 80 dotyczy układu kolumny


417

Sposób zrobić wskazanie 80-kolumny w vim wydaje się nieprawidłowy: set columns=80. Czasami ja również set textwidth, ale chcę być w stanie zobaczyć i przewidzieć przepełnienie linii za pomocą set columnsalternatywy.

Ma to kilka niefortunnych skutków ubocznych:

  1. Nie mogę set numberobawiać się podziału na pliki o różnych porządkach numerów linii; tzn. <100 plików linii i> = 100 plików linii będzie wymagać dwóch różnych set columnswartości ze względu na dodatkową kolumnę używaną do wyświetlania dodatkowych cyfr.
  2. Zaczynam też nowe (g) sesje Vima zamiast rozdzielać okna w pionie. Jest tak, ponieważ vsplitzmusza mnie do set columnskażdorazowego otwierania lub zamykania okienka, więc rozpoczęcie nowej sesji jest mniej kłopotliwe.

Jak radzisz sobie ze wskazaniem 80 znaków, kiedy chcesz set numbers, podział w pionie itp.?


60
Jest uważany za dobry styl kodu w wielu kręgach; na przykład Przewodnik po stylu Pythona (PEP8) zaleca 79 wierszy znaków: python.org/dev/peps/pep-0008
cdleary

4
Nie jest to absolutnie „musisz mieć 80 linii znaków”, ale sprawia, że ​​czytanie w niektórych systemach jest przyjemniejsze, na przykład w każdej aplikacji konsolowej, która nie działa w oknie konsoli GUI, której rozmiar można zmienić.
Matthew Scharley

47
@davr: Po pierwsze, łatwiej jest czytać. Niektóre badania sugerują, że krótka linia (76 znaków w linii) jest najbardziej przyjemna i najszybsza do odczytania online. Czy wiesz o tym: nagle twoje oczy są w niewłaściwej linii podczas czytania? Zdarza się to rzadko w przypadku 80 znaków. Po drugie, często edytuję lub różnicuję wizualnie dwa pliki obok siebie na monitorze o szerokości 1600 pikseli. Działa to dobrze tylko wtedy, gdy plik nie ma linii dłuższych niż 80 znaków. Dlatego często zmieniam formatowanie długich linii, zanim będę mógł wydajnie pracować.
dokładnie

25
@davr jest niezwykle przydatny do edycji kilku plików obok siebie.
aehlke,

2
Robię znacznie mniej błędów zarówno w kodzie C / C ++, jak i JS, odkąd przyjąłem szerokość linii 80 znaków (ze stylu kodowania jądra). Czasami przepełniam go o parę, ale rzadko ...
Mark K Cowan

Odpowiedzi:


586

Mam to skonfigurowane w moim .vimrc:

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

Podkreśla to tło w subtelnym czerwonym kolorze dla tekstu przekraczającego limit 80 kolumn (subtelny w trybie GUI, w każdym razie - w trybie terminalowym jest mniej).


3
Świetny pomysł! Zmieniłem to na „ctermbg = darkred” i „guibg = # FFD9D9”, aby lepiej pasowały do ​​moich potrzeb (jasne tło w gvim i ciemne w trybie cterm).
HS.

10
Myślę, że subtelną poprawką jest /\%81v.\+/ - z jakiegoś powodu. * Wyróżnia miejsca, w których nie istnieją postacie.
cdleary

14
Myślę, że ta linia jest nieco lepsza dla wyrażenia regularnego dopasowania: match OverLength /\%>80v.\+/ To nie wyróżnia znaku „końca linii”, a także jest bardziej intuicyjne, po prostu ustawiając liczbę na żądaną długość linii, a nie +1.
David Terei

8
Z jakiegoś powodu to działa tylko w pierwszym otwartym bufora dla mnie (pierwsze okno z pierwszej zakładce) w moim ... vim
lajarre

3
Sprawdź stackoverflow.com/a/10993757/9822, jeśli to rozwiązanie działa tylko w pierwszym buforze.
Jesse Vogt,

769

Od wersji vim 7.3 możesz używać set colorcolumn=80( set cc=80w skrócie).

Ponieważ wcześniejsze wersje tego nie obsługują, .vimrczamiast tego moje zastosowania:

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

Zobacz także dokumentację online dotyczącą tej colorcolumnopcji .


26
Możesz nawet automatycznie oprzeć wartość „kolumny kolorów” na „szerokości tekstu” za pomocą czegoś takiego: ustaw cc = + 1
graywh

1
has („colorcolumn”) nie działało dla mnie. Musiałem użyć zamiast tego istnieje („& colorcolumn”).
SpoonMeiser

5
Bardzo fajnie, z wyjątkiem tego, że vim <7.1.40 nie obsługuje matchadd.
Greg Jandl

19
możesz również zmienić kolor kolumny za pomocąhighlight ColorColumn ctermbg=7
null_radix

2
Dokumentacja tej opcji znajduje się na stronie vimdoc.sourceforge.net/htmldoc/options.html#%27colorcolumn%27
JohnTESlade

54

Krótsza droga:

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

8
Naprawdę podoba mi się to, ponieważ nie zanieczyszcza mojego bufora długą pionową linią! (Y)
Ionică Bizău

ErrorMsgjest highlight-group. W Vimie jest wiele domyślnych grup świateł, których możesz używać w oparciu o kodowanie kolorów, które chcesz zastosować w tym przypadku.
crisron 27.04.18

49

Wolę:

highlight ColorColumn ctermbg=gray
set colorcolumn=80

Ten mi się podoba. Użyłem czerni zamiast szarości i było to bardziej subtelne, ponieważ moje tło jest prawie czarne, ale nie całkiem.
Oscylacja Isopycnal

30

Odpowiedź Simona Howarda jest świetna. Ale /\%81v.\+/nie wyróżnia kart przekraczających kolumnę 81. Więc zrobiłem małe ulepszenie, w oparciu o rzeczy, które znalazłem na wiki VIM i wybór kolorów HS powyżej:

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

A teraz VIM podświetli wszystko, co przekracza kolumnę 80.


2
Może chcę dodać tam guifg=whitena końcu.
Dan Bechard

17

wprowadź opis zdjęcia tutaj

Minimalistyczne, nie over-the-top podejście. Podświetlany jest tylko 79 znak zbyt długich linii. Rozwiązuje kilka typowych problemów: działa na nowych oknach, przepełnione słowa są odpowiednio podświetlone.

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

Uwaga: zwróć uwagę, że FileType scala,javaogranicza to to do plików źródłowych Scala i Java. Prawdopodobnie będziesz chciał to dostosować. Jeśli miałbyś go pominąć, działałoby to na wszystkich typach plików.


Dlaczego dodałeś FileType scala,java? (nie działa dla mnie)
Dorian

1
@Dorian ogranicza to do typów plików Scala i Java, ponieważ były to typy plików, nad którymi wtedy pracowałem. Zaniedbałem o tym wspomnieć. Aktualizuję odpowiedź.
Dominykas Mostauskis

Jakiej czcionki używasz na zrzucie ekranu? Uważam to za bardzo przyjemne dla oka.
Wieża

@Idigas: Zgadzam się i wydaje mi się, że być może Komiks Sans był złym wyborem, kiedy początkowo konfigurowałem PuTTY :)
Mark K Cowan

Nie udało mi się uzyskać fragmentu tej odpowiedzi do działania w Vimie 7.4. (
Usunąłem

13

Możesz także narysować linię, aby zobaczyć limit 80:

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

Wynik:

wprowadź opis zdjęcia tutaj


13

Dobry sposób na oznaczenie tylko pierwszego znaku wychodzącego z określonych granic:

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

Z przemówienia Damiana Conwaya .


7

Nowsze wersje vima pozwalają na :set numberwidth=xwartość, która określa szerokość wyświetlania numeru linii. Tak naprawdę nie używam składania itp., Więc nie wiedziałbym o tym. Narysowanie cienkiej linii pionowej jest jednak poza możliwościami aplikacji konsolowej. GVim może na to pozwolić (nie używam tego, więc nie mogę komentować).


5

Obawiam się, że nałożyłeś ograniczenia na zestaw rozwiązań, które, no cóż, pozostawiają ci zestaw zerowy.

Użycie :set textwidth=80poprawi wszystkie problemy, o których wspomniałeś, poza tym, że nie zobaczysz zbliżającego się limitu linii. Jeśli tak :set ruler, włączysz wyświetlanie pozycji x, y na pasku stanu, za pomocą którego możesz sprawdzić, w której kolumnie się znajdujesz.

Poza tym nie jestem pewien, co ci powiedzieć. Szkoda stracić kolumnę liczb, złożyć kolumnę i podzielić tylko dlatego, że musisz :set columns=80.


Tak, bałem się tego ... Miałem nadzieję, że będzie ukryty sposób na narysowanie cienkiej pionowej linii, jak w bardziej zorientowanych graficznie edytorach.
cdleary

5

Możesz spróbować:

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

Spowoduje to ustawienie dwóch wyróżnień w każdym buforze, jednego dla znaków w 8 kolumnach przed tym, co &textwidthjest ustawione, i jednego dla znaków poza tą kolumną. W ten sposób masz pewien stopień oczekiwania. Oczywiście możesz go dostosować, aby używał innej szerokości, jeśli chcesz mniej lub bardziej przewidywania (za co płacisz w postaci utraty podświetlenia składni w tych kolumnach).


3

Patrząc na kolumny: help, nie jest tak naprawdę do robienia bałaganu.

W konsoli jest to zwykle określane przez ustawienie konsoli (tzn. Jest wykrywane automatycznie); w GUI określa (i jest określany przez) szerokość okien gvim.

Zwykle pozwalasz konsolom i menedżerom okien wykonywać swoje zadania, komentując to set columns

Nie jestem pewien, co masz na myśli przez „zobacz i przewiduj przepełnienie linii”. Jeśli chcesz wstawić EOL z grubsza w kolumnie 80, użyj albo set textwidthlub set wrapmargin; jeśli chcesz tylko miękkiego zawijania (tzn. linia jest owinięta, ale nie ma rzeczywistego EOL), to zagraj za pomocą set linebreaki set showbreak.


2

ten jest poza lewym polem, ale jest to ładna mała mapa do zmiany obecnego podziału na 80 znaków, jeśli masz numery linii:

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

1

Możesz spróbować ustawić rozmiar okna, aby zezwolić na 80 znaków rzeczywistego tekstu. To jednak nadal nie działa w przypadku podziałów pionowych.

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

Wymaga to vim 7+, 7.3 dla relatywnej liczby.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.