Vim 80 столбцов макет проблем


417

Способ я указание 80-столбца в Vim кажется неправильным: set columns=80. Иногда я тоже set textwidth, но я хочу быть в состоянии увидеть и предвидеть переполнение линии с set columnsальтернативой.

Это имеет некоторые неприятные побочные эффекты:

  1. Я не могу из- set numberза страха разделения между файлами с разными порядками номеров строк; т. е. <100 строковых файлов и> = 100 строковых файлов потребуют два разных set columnsзначения из-за дополнительного столбца, используемого для отображения дополнительных цифр.
  2. Я также начинаю новые (g) сессии Vim вместо разделения окон по вертикали. Это связано с тем vsplit, что set columnsкаждый раз, когда я открываю или закрываю панель, я вынужден открывать новую сессию.

Как вы справляетесь с 80-символьной индикацией, когда хотите set numbers, вертикальным разделением и т. Д.?


60
Это считается хорошим стилем кода во многих кругах; Например, Python's Guide Guide (PEP8) рекомендует 79 строк символов: python.org/dev/peps/pep-0008
cdleary

4
Это не абсолютное «у вас должно быть 80 символьных строк», но это делает его более удобным для чтения в некоторых системах, например, в любом консольном приложении, которое не работает в окне консоли графического интерфейса пользователя, которое можно изменить.
Мэтью Шарли

47
@davr: во-первых, легче читать. Некоторые исследования предполагают, что короткая длина строки (76 символов в строке) является наиболее приятной и быстрой для чтения в Интернете. Знаете ли вы это: вдруг вы читаете неправильную строчку? Такое редко случается с 80 персонажами. Во-вторых, я часто редактирую или различаю визуально два файла рядом на моем мониторе шириной 1600 пикселей. Это хорошо работает, только если в файле нет строк длиной более 80 символов. Поэтому я часто переформатирую длинные строки, прежде чем смогу работать эффективно.
Вскоре

25
@davr это невероятно полезно для одновременного редактирования нескольких файлов.
aehlke

2
Я делаю гораздо меньше ошибок в C / C ++ и JS-коде, так как я принял ширину строки в 80 символов (из стиля кодирования ядра). Я иногда переполняю это парой, но редко ...
Марк К Коуэн

Ответы:


586

Я настроил это в моем .vimrc:

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

Это выделяет фон тонким красным цветом для текста, который превышает ограничение в 80 столбцов (в любом случае, в режиме графического интерфейса тонкое - в режиме терминала это не так).


3
Отличная идея! Я изменил его на "ctermbg = darkred" и "guibg = # FFD9D9", чтобы лучше соответствовать моим потребностям (светлый фон в gvim и темный в режиме cterm).
ГС.

10
Я думаю, что тонкое исправление - это /\%81v.\+/ - по какой-то причине. * Выделяет места, где символы не существуют.
cledary

14
Я думаю, что эта строка немного лучше для регулярного выражения: match OverLength /\%>80v.\+/ Это не выделяет символ «конец строки», а также является более интуитивным, поскольку вы просто устанавливаете число на то, что хотите длина строки не +1.
Дэвид Терей

8
По какой-то причине он работает только в первом открытом буфере для меня (первое окно первой вкладки) в моем vim ...
lajarre

3
Проверьте stackoverflow.com/a/10993757/9822, если это решение работает только в вашем первом буфере.
Джесси Фогт

769

Начиная с версии 7.3 вы можете использовать set colorcolumn=80( set cc=80для краткости).

Поскольку более ранние версии не поддерживают это, я .vimrcиспользую вместо этого:

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

Смотрите также онлайн документацию по colorcolumnопции .


26
Вы даже можете автоматически основывать значение 'colorcolumn' на 'textwidth' с помощью чего-то вроде: set cc = + 1
graywh

1
has ("colorcolumn") не работает для меня. Вместо этого мне пришлось использовать существует ("& colorcolumn").
SpoonMeiser

5
Очень хорошо, за исключением того, что vim <7.1.40 не поддерживает matchadd.
Грег Jandl

19
Вы также можете изменить цвет столбца с помощьюhighlight ColorColumn ctermbg=7
null_radix

2
Документация по этой опции находится по адресу vimdoc.sourceforge.net/htmldoc/options.html#%27colorcolumn%27
JohnTESlade

54

Более короткий путь:

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

8
Мне это очень нравится, потому что это не загрязняет мой буфер длинной вертикальной линией! (Y)
Ионика Бизэу

ErrorMsgявляется highlight-group. В Vim есть множество групп подсветок по умолчанию, которые вы можете использовать на основе цветовой кодировки, которую вы хотите для этого случая.
Крисон

49

Я предпочитаю:

highlight ColorColumn ctermbg=gray
set colorcolumn=80

Мне нравится этот. Я использовал черный вместо серого, и это было более тонким, так как мой фон почти черный, но не совсем.
Изопикнальное колебание

30

Ответ Саймона Ховарда великолепен. Но /\%81v.\+/не в состоянии выделить вкладки, которые превышают столбец 81. Поэтому я немного изменил настройки, основываясь на материалах, которые я нашел на вики-сайте VIM, и на выборе цветов HS выше:

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

И теперь VIM выделит все, что превышает столбец 80.


2
Может быть, хочу добавить guifg=whiteв конце там.
Дэн

17

введите описание изображения здесь

Минималистичный, не чрезмерный подход. Только 79-й символ слишком длинных строк выделяется. Он преодолевает несколько распространенных проблем: работает в новых окнах, переполненные слова выделены правильно.

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

Примечание: обратите внимание, что FileType scala,javaэто ограничивает исходные файлы Scala и Java. Возможно, вы захотите настроить это. Если вы опустите его, он будет работать на всех типах файлов.


Почему вы добавили FileType scala,java? (не работает для меня)
Дориан

1
@Dorian ограничивает это типами файлов Scala и Java, потому что это были типы файлов, над которыми я работал в то время. Я не упомянул об этом. Обновление ответа.
Доминикас Мостаускис

Какой шрифт вы используете на скриншоте? Я нахожу это очень приятным для глаз.
Ладья

@Idigas: Согласен, и я чувствую, что, возможно, Comic Sans, возможно, был плохим выбором, когда я изначально установил PuTTY :)
Марк К Коуэн

Я не смог заставить фрагмент этого ответа работать в Vim 7.4. (Я тоже удалил фильтр
FileType

13

Вы также можете нарисовать линию, чтобы увидеть 80 предел:

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

Результат:

введите описание изображения здесь


13

Хороший способ пометить только первый символ, выходящий за указанные границы:

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

Из разговора Дамиана Конвея .


7

Более новые версии vim допускают :set numberwidth=xзначение, которое устанавливает ширину отображения номера строки. Я на самом деле не использую складывание и т. Д., Поэтому я бы не знал об этом. Хотя рисование тонкой вертикальной линии выходит за рамки консольного приложения. GVim может разрешить это (я не использую это, поэтому не могу комментировать там).


5

Я боюсь, что вы наложили ограничения на набор решений, которые, ну, оставляют вас с нулевым набором.

Использование :set textwidth=80исправит все проблемы, которые вы упомянули, за исключением того, что вы не можете легко увидеть приближающийся предел линии. Если вы :set ruler, вы включите отображение положения x, y в строке состояния, которое вы можете использовать, чтобы увидеть, в каком столбце вы находитесь.

Кроме того, я не уверен, что тебе сказать. Стыдно терять числовой столбец, складывать столбец и разбивать только потому, что вам нужно :set columns=80.


Да, я боялся этого ... Я надеялся, что будет скрытый способ нарисовать тонкую вертикальную линию, как в более графически ориентированных редакторах.
cledary

5

Вы можете попробовать это:

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

Это создаст две подсветки в каждом буфере, один для символов в 8 столбцах перед тем, что вы &textwidthустановили, и один для символов за пределами этого столбца. Таким образом, у вас есть некоторая степень ожидания. Конечно, вы можете настроить его, чтобы использовать другую ширину, если вы хотите более или менее предвосхищения (за которое вы платите в виде потери подсветки синтаксиса в этих столбцах).


3

Что ж, глядя на столбцы: help, на самом деле с ним не связываются.

В консоли это обычно определяется настройками консоли (т.е. определяется автоматически); в графическом интерфейсе он определяет (и определяется) ширину окон gvim.

Поэтому обычно вы просто позволяете консолям и оконным менеджерам выполнять свою работу, комментируя set columns

Я не уверен, что вы подразумеваете под «увидеть и предвидеть переполнение линии». Если вы хотите, чтобы EOL вставлялся примерно в столбец 80, используйте либо set textwidthили set wrapmargin; если вы просто хотите мягкую перенос (то есть строка переносится, но без фактического EOL), поиграйте с set linebreakи set showbreak.


2

это поле находится вне левого поля, но это хорошая маленькая карта для изменения размера вашего текущего разбиения до 80 символов, если у вас есть номера строк:

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

1

Вы можете попробовать это, чтобы установить размер окна, чтобы разрешить 80 символов реального текста. Это все еще не работает с вертикальными расщеплениями все же.

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

Для этого требуется vim 7+, 7.3 для относительного номера.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.