Проблеми з компонуванням стовпців 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 (PEP8) рекомендує 79 символьних рядків: python.org/dev/peps/pep-0008
cdleary

4
Це не є абсолютним "у вас повинно бути 80 символьних ліній", але це робить приємніше читати в деяких системах, наприклад, будь-який додаток на основі консолі, який не працює у вікні консолі GUI, який можна змінити.
Меттью Шарлі

47
@davr: По-перше, легше читати. Деякі дослідження говорять про те, що коротка довжина рядка (76 символів на рядку) є найбільш приємною та швидкою для читання в Інтернеті. Чи знаєте ви це: раптом ваші очі опиняються неправильно під час читання? Це рідко трапляється з 80 символами. По-друге, я часто редагую або відрізняюсь візуально двома файлами поруч на моєму моніторі широкою 1600 пікселів. Це добре працює лише в тому випадку, якщо у файлу немає рядків, що містять більше 80 символів. Тому я часто переформатую довгі рядки, перш ніж я можу ефективно працювати.
nalply

25
@davr - це неймовірно корисно для редагування декількох файлів поряд.
aehlke

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

Відповіді:


586

У мене це налаштування в моєму .vimrc:

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

Це виділяє тло тонким червоним кольором для тексту, який перевищує межу стовпця 80 (тонкий у режимі GUI, у будь-якому випадку - у термінальному режимі все менше).


3
Чудова ідея! Я змінив його на "ctermbg = затемнено" та "guibg = # FFD9D9", щоб краще відповідати моїм потребам (світлий фон у гвімі та темний у режимі cterm).
ГС.

10
Я думаю, що тонка корекція є /\%81v.\+/ - чомусь. * Виділяє місця, де символів немає.
cdleary

14
Я думаю, що цей рядок трохи кращий для регулярного вираження матчу: матч OverLength /\%>80v.\+/ Це не підкреслює характер 'кінця рядка', а також є більш інтуїтивно зрозумілим, оскільки ви просто встановлюєте число до того, що вам потрібно довжина лінії повинна бути не +1.
Девід Терей

8
Чомусь він працює лише в першому відкритому для мене буфері (перше вікно першої вкладки) в моєму vim ...
lajarre

3
Перевірте stackoverflow.com/a/10993757/9822, якщо це рішення працює лише у вашому першому буфері.
Джессі Фогт

769

Від vim 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.
Грег Джандл

19
ви також можете змінити колір стовпця зhighlight ColorColumn ctermbg=7
null_radix

2
Документацію для цього варіанту можна знайти на vimdoc.sourceforge.net/htmldoc/options.html#%27colorcolumn%27
JohnTESlade

54

Коротший шлях:

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

8
Мені це дуже подобається, тому що він не забруднює мій буфер довгою вертикальною лінією! (Y)
Ionică Bizău

ErrorMsgє a 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 :)
Mark K Cowan

Я не зміг отримати фрагмент у цій відповіді для роботи у Vim 7.4. (Я також видалив фільтр FileType.)
Mnebuerquo

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.


Так, я цього боявся ... Я сподівався, що буде прихований спосіб намалювати тонку вертикальну лінію, як у більш графічно орієнтованих редакторах.
cdleary

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

Ну, дивлячись на: довідкові стовпчики, насправді це не возиться.

У консолі вона зазвичай визначається конфігурацією консолі (тобто вона виявляється автоматично); в GUI він визначає (і визначається) шириною вікон 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.