Можно ли отображать направляющие для отступов в Vim? - PullRequest
45 голосов
/ 29 января 2010

Я давний пользователь Vim (3 или 4 года), который недавно начал работать с каким-то глубоко вложенным кодом. Этот код имеет отступы, а не символы табуляции. Мне бы хотелось, чтобы какой-нибудь чистый и не отвлекающий признак отступа помогал отслеживать, в каком блоке кода я нахожусь, когда смотрю на что-то на нескольких уровнях.

:set list 

Отображает только символы табуляции и конца строки. Я нашел один плагин (кажется, не могу его вскопать в данный момент), который будет подсвечивать каждый уровень отступа темными цветами, но это визуально непривлекательно. В идеале я хотел бы видеть тонкие вертикальные линии на каждом уровне отступа. У многих новомодных редакторов есть эта функциональность, но я пока не хочу отказываться от Vim.

Кто-нибудь знает, как этого можно достичь?

Ответы [ 7 ]

66 голосов
/ 11 февраля 2011

ПРИМЕЧАНИЕ: Этот ответ немного запоздал на вечеринку, а также бесстыдный штекер:)

В любом случае, попробуйте мой Indent-Guides.vim плагин. Это было создано, чтобы почесать мой собственный зуд относительно отсутствия направляющих отступов в vim. Я сыт по горло ожиданием, что кто-то другой придет и построит его, поэтому я просто сделал это сам.

Особенности:

  • Может обнаруживать стили отступов табуляции и пробелов.
  • Автоматически проверяет цветовую схему и выбирает подходящие цвета (только gVim).
  • Подсвечивает уровни отступа чередующимися цветами.
  • Полная поддержка gVim и базовая поддержка Terminal Vim.
  • Кажется, что работает на Windows gVim 7.3 (хотя и не провел каких-либо обширных испытаний).
  • Настраиваемый размер для направляющих, например. узкие направляющие (только софт-вкладки).
  • Настраиваемый начальный уровень отступа.

Вот несколько скриншотов плагина в действии: , наведите курсор мыши и нажмите .

27 голосов
/ 06 декабря 2012

Если вы делаете отступ в коде с пробелами, вы можете попробовать плагин my : https://github.com/Yggdroot/indentLine,, который отображает тонкие вертикальные линии, но не толстые вертикальные, как упоминалось выше. Если вы сделаете отступ с помощью табуляции, просто :set list lcs=tab:\|\ (here is a space)

27 голосов
/ 29 января 2010

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

" use 4 spaces for tabs
set tabstop=4 softtabstop=4 shiftwidth=4

" display indentation guides
set list listchars=tab:❘-,trail:·,extends:»,precedes:«,nbsp:×

" convert spaces to tabs when reading file
autocmd! bufreadpost * set noexpandtab | retab! 4

" convert tabs to spaces before writing file
autocmd! bufwritepre * set expandtab | retab! 4

" convert spaces to tabs after writing file (to show guides again)
autocmd! bufwritepost * set noexpandtab | retab! 4
15 голосов
/ 30 января 2010

Вероятно, наиболее эффективным решением было бы "нарисовать" направляющие для отступов используя подсветку спичек. Чтобы понять, как это помогает, посмотрите на этот пример:

:match Search /\%(\_^\s*\)\@<=\%(\%1v\|\%5v\|\%9v\)\s/

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

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

function! ToggleIndentGuides()
    if exists('b:indent_guides')
        call matchdelete(b:indent_guides)
        unlet b:indent_guides
    else
        let pos = range(1, &l:textwidth, &l:shiftwidth)
        call map(pos, '"\\%" . v:val . "v"')
        let pat = '\%(\_^\s*\)\@<=\%(' . join(pos, '\|') . '\)\s'
        let b:indent_guides = matchadd('CursorLine', pat)
    endif
endfunction

Каждый раз, когда вам нужны направляющие для отступов в буфере, он может быть включен :call ToggleIndentGuides(). Конечно, вы можете изменить группу подсветки (или создайте специальный для использования только в руководствах по отступам), настройте удобный сопоставление 1 для этого и / или вызов его из autocmd для некоторого файла типы.


1 Направляющие для отступов, выделяющие конфигурацию из моего .vimrc файл: https://gist.github.com/734422

15 голосов
/ 29 января 2010

Это покажет точки, чтобы указать ваш уровень отступа при вводе. Точки волшебным образом исчезают, когда вы покидаете линию.

set list listchars=tab:»-,trail:·,extends:»,precedes:«

например:

def test():
....print('indentation level 1')

Довольно круто, да?

1 голос
/ 29 января 2010

Попробуйте этот плагин VIM BlockHL Цвет по-разному кодирует отступ каждого последующего уровня.

РЕДАКТИРОВАТЬ: Какой язык вы используете? Этот плагин для языков стиля C.

0 голосов
/ 16 июня 2015

используйте плагин Indent-Guides.vim и переключайте использование ig, когда вам это нужно. Иногда это может раздражать:)

...