Как добавить направляющие / линии отступов

42

В Sublime Text 2 вы получаете вертикальные направляющие, где ваш отступ, например:

Sublime Text скриншот

но в VIM я, очевидно, не

скриншот vim

Есть ли способ показать такие строки в vim? Кстати, мой отступ - 2 пробела.

:set tabstop=2 softtabstop=2 shiftwidth=2 expandtab
aharris88
источник

Ответы:

39

Единый ответ:

Если вы используете вкладки

Я бы попробовал использовать listchars:

:set listchars=tab:\|\ 
:set list

примечание: после последнего есть пробел \.

Этот метод хорош, потому что он использует встроенную поддержку Vim для показа такого рода вещей.

Пример вывода:

|       if (1) {
|       |       func();
|       }

скриншот образца текста выше

Тем не менее, это не работает для ведущих мест. Как отметил @Josh Petrie, есть патч для пробелов , но тогда вам придется перекомпилировать Vim, что выходит за рамки этого ответа.

Если вы используете пробелы, и не против использования плагина

Вайбхав Сагар отмечает, что плагин indentLine выполняет эту функцию.

Установите обычным способом (см. Установка плагинов ), и он, кажется, волшебным образом работает без дальнейшего ввода. Если вы не против столбцов ASCII, вам не нужно ничего делать со своими шрифтами. Пример вывода вашего примера после установки параметров отступа и запуска:IndentLinesReset

45   ¦ var move = function(direction) {
46   ¦ ¦ if(!initialized) { initialize(); }
47 
48   ¦ ¦ if(shiftBoard(direction)) {
49   ¦ ¦ ¦ setTimeout(addRandomPiece, 100);
50   ¦ ¦ }
51   ¦ };

скриншот примера с пробелами

Плагин требует Vim 7.3 или более поздней версии, и делает умным использование функции Conceal этой версии. Вместо того, чтобы фактически скрывать текст, он заменяет текст панелями в представлении, но не фактическим буфером. В результате вы видите столбцы, но они не сохраняются в файл (так как они на самом деле пробелы)

Предостережение

Оба эти метода предполагают «правильно» код с отступом. Они не размещают линии отступа на уровне отступа при открытии «блока» (что, похоже, делает возвышенное), а вместо этого размещают линии через равные промежутки времени в зависимости от настроек отступа. Кроме того, он показывает только столбцы в строках, где есть место (поэтому в строке вывода vim под первым ifнет столбцов, что создает визуальный разрыв)

Джон О'М.
источник
На самом деле, я использую пробелы для отступа вместо вкладок. Я обновил свой вопрос.
ахаррис88
Ой. Что ж, это потребует дополнительных исследований.
Джон ОМ.
1
Существует патч для работы списочных символов для непоследних пробелов, которые вы можете найти в списке рассылки. Однако, он не был принят в официальный дистрибутив :(
1
Обновленный ответ, включающий информацию от Вайбхава Сагара и Джоша Петри. Я опробовал плагин, упомянутый Вайбхавом, и показал результаты в отредактированном ответе. Я думаю, что я собираюсь начать использовать этот плагин сам. Это не фантастика, но в целом, кажется, работает довольно хорошо.
Джон ОМ.
1
indentLine отлично работает для python, json, viml, c, c ++ и т. д. Но, к сожалению, он не работает с vim-javascript, поэтому вместо этого я использую vim-indent-guides.
Сасан
19

Другой вариант, который я использую, который не совсем соответствует тому, о чем вы просили, но выполняет ту же задачу, чтобы упростить просмотр того, что находится в том же столбце, - это установить в вашем файле следующее vimrc:

set cursorcolumn
set cursorline

иллюстрация курсора

Это имеет компромисс, что вы должны переместить курсор на столбец, который вы хотите видеть, но вы получите меньше визуального беспорядка. Обычно, когда меня интересуют уровни отступов, я все равно сохраняю свое место курсором. Мой путь также не так неловко выглядит в таких языках, как python без закрывающих скобок.

Карл Билефельдт
источник
Пользователи Python vi умрут за эту особенность
shuva
18

Для полноты картины есть также плагин Indent Guides , который показывает уровни отступов, чередуя цвета пробелов. Требуется версия 7.2 или выше. Так как она использует tabstopи shiftwidthпеременные, это вероятно , будет работать для настройки отступа сразу.

Imgur

После того, как плагин установлен, вы можете просто использовать :IndentGuidesEnableили :IndentGuidesDisable. Если вы используете терминал vim, обратите внимание, что, согласно инструкции,

На данный момент Terminal Vim имеет только базовую поддержку. Это означает, что цвета не будут автоматически рассчитываться на основе вашей схемы цветов. Вместо этого используются некоторые предустановленные цвета в зависимости от того, задан ли фон темным или светлым.

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

let g:indent_guides_auto_colors=0

поэтому при замене буферов цвета не пересчитываются, а затем устанавливают цвета с помощью

hi IndentGuidesEven ctermbg=238
hi IndentGuidesOdd ctermbg=236

Как и в случае с другими представленными решениями, он показывает только направляющие для отступов в строках, где есть пробелы.

Guillem
источник
добавить let g:indent_guides_enable_on_vim_startup=1в мой .vimrc, чтобы включить это при запуске.
inye
9

Я нашел плагин IndentLine, чтобы быть лучшим для этого. Вам нужен шрифт с соответствующими символами, но я считаю, что Consolas на Windows и Menlo на Mac OS X работают хорошо. Как указано в унифицированном ответе выше, он работает (ab), используя concealфункцию vim для размещения вертикальных полос (из используемого шрифта) в нужном месте. Я очень доволен этим решением, но его недостатком является то, что мои вертикальные полосы являются частью глифов для рисования прямоугольников и выровнены по центру, а не по левому краю, как в других редакторах. Я привык к этому, но это можно исправить, вручную исправляя свой шрифт или используя такой шрифт, как Fantasque Sans Mono (обратите внимание, как на скриншотах в связанном репозитории github используется indentLine).

Вайбхав Сагар
источник
4
Пожалуйста, ознакомьтесь с нашим обсуждением ответов только для плагинных ссылок и рассмотрите возможность дополнения своего ответа дополнительной информацией.
Моя ошибка, я обновил свой ответ.
Вайбхав Сагар
Какой глиф является исправленной вертикальной линией? Вы можете вставить это здесь? Спасибо.
Timtro
2

Плагин indentLine имеет тенденцию быть довольно медленным на немалых файлах, наблюдаемых при нажатии Enter, поскольку он отстает на секунду или около того.

Я обнаружил, что vim-indentguides - более быстрый и визуально похожий плагин, который также визуально отличает отступы табуляции от отступов пространства.

jaybay
источник