Линукс, Vim, LaTeX, полезные скрипты, визуализация данных, численные расчёты, немного ФП

20090505

Показать длинные (>80) строчки в Vim

Большинство программистов согласятся, что строчки кода должны быть короче 80 символов. Часто это просто хороший тон: читаем Linux Kernel Coding Style (80) , Style Guide for Python code (79), Good Haskell Style (79), Ruby Coding Conventions (80), Google C++ Style Guide (80)...

Практический вопрос: а как в Vim увидеть, что строка стала длиннее 80 символов? Это может быть очень полезно, если ширина окна больше 80. Простой и дубовый способ: 80| и курсор перемещается на 80-ю колонку. Однако каждую строчку так проверять неудобно.

Более элегантный выход — подсвечивать всё, что за 80-ю колонку вылазит. Сразу куча (похожих) рецептов: Highlight long lines.

Включить подсветку вручную:
:match ErrorMsg '\%>80v.\+'
Чтобы включать подсветку автоматически, каждый раз при открытии буфера, в ~/.vimrc помещаем:
:au BufWinEnter * let w:m1=matchadd('Search', '\%<81v.\%>77v', -1)
:au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%>80v.\+', -1)
Должно работать в Vim после 7.1.40. При этом последние 4 символа до 80-й колонки будут предупреждающе подсвечиваться «поиском», а все, что после 80-й — «ошибкой».

Дополнение: в комментариях предложен ещё и другой способ выделить последние 4 символа строки:
:au BufWinEnter * let w:m1=matchadd('Search', '\%>76v.*\%<81v', -1)
Тоже работает.


Получается вот так:



Про подсветку табуляций вперемежку с пробелами и концевых пробелов см. следующую заметку.

8 коммент.:

  1. а чем это удобнее, чем set tw=80?

    ОтветитьУдалить
  2. textwidth позволяет строчки переносить, а подсветка позволяет видеть слишком длинные строчки. В общем-то, приведённые примеры можно изменить так, чтобы они учитывали &textwidth.

    ОтветитьУдалить
  3. у меня работает такое:
    match BadFormat /\s\+$\|\ \+\t\| \{8,}\|\%81v/
    подвечивает только 81-ый символ и кривые пробелы/табы

    плюс ftplugin меняющий формат для питона.

    ОтветитьУдалить
  4. Хороший текстовый редактор без проблем переносит строки; в хороших языках программирования перенесённое продолжение строки визуально резко отличается от начала. Следовательно, ограничение на длину строки становится бессмысленным.

    ОтветитьУдалить
  5. 2 migmit:

    Ограничение на длину строки остаётся осмысленным. 1) Оптимальная длина строки, с точки зрения удобства чтения — около 60–70 символов — не случайно газеты печатают узкими колонками; 2) Фиксированная длина строки позволяет без проблем размещать рядом несколько окон/терминалов, это особенно полезно при слиянии изменений или на больших экранах, 3) Именно потому, что перенесённые продолжения строк визуально резко отличаются от начала — получается некрасиво и ненаглядно — и лучше сделать так, чтобы было красиво всегда.

    Лишь (2) является техническим ограничением, (1) и (3) связаны с особенностями человеческого зрения и восприятия.

    Вот, кстати, обсуждение вопроса.

    ОтветитьУдалить
  6. Этот комментарий был удален администратором блога.

    ОтветитьУдалить
  7. У меня vim 7.2 и ваш пример с 77-80 строками не сработал, только второй.
    Порылся немного в мануале вима и исправил на такой:

    :au BufWinEnter * let w:m1=matchadd('Search', '\%>76v.*\%<81v', -1)

    ОтветитьУдалить
  8. Павел, странно, у меня 7.2.79, и работает. Поиск /\%<81v. выделяет все непустые символы левее 80-й колонки включительно (проверяю с hlsearch). Но твой вариант '\%>76v.*\%<81v' тоже работает. На всякий случай, включу и его в заметку. Спасибо.

    ОтветитьУдалить