Как мне свернуть до определенного уровня в Vim по всему файлу сразу - PullRequest
4 голосов
/ 17 сентября 2011

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

Этот вопрос SO: Vim: только верхний уровень сгиба сгибов имеет решение для уровня отступа, нодля этого требуется среда, устанавливаемая при каждом изменении уровней.

Когда мой курсор находится на уровне отступа (скажем, на уровне 2), я хочу, чтобы весь файл свернулся до этого уровня отступа во всех методах.

Это где-то встроено в Vim?Кто-нибудь знает хороший плагин, который делает это?

Ответы [ 3 ]

3 голосов
/ 17 сентября 2011

Настройте свертывание, чтобы оно определялось с помощью отступа

:setl foldmethod=indent

и попробуйте команду

:let &l:foldlevel = indent('.') / &shiftwidth

Чтобы быстро получить доступ к этой команде, создайте для нее отображение следующим образом.

:nnoremap <silent> <leader>z :let&l:fdl=indent('.')/&sw<cr>
0 голосов
/ 01 декабря 2017

Плагин не нужен, он встроен в Vim.

'foldlevel' (или более короткий 'fdl') и 'foldnestmax' ('fdn'), похоже, то, что мы искали.Вам нужно только установить 'foldmethod' (или более короткий 'fdm') и 'foldnestmax' (или 'fdn') в вашем файле .vimrc:

set foldmethod=indent foldlevelstart=2 foldnestmax=2

ИЛИ более короткую версию:

set fdm=indent fdls=2 fdn=2

Затем вы можете изменить уровень сгиба с помощью прямых команд: zm или zr.

0 голосов
/ 23 мая 2015

Поскольку foldnestmax не применяется, когда метод foldold expd истек, я искал что-то еще, когда натолкнулся на ваш вопрос. Вот то, что я придумал, что несомненно может быть улучшено:

function! <sid>CloseFoldOpens(opens_level)
    let lineno = 2
    let last = line("$")
    while lineno < last
        if foldclosed(lineno) != -1
            let lineno = foldclosedend(lineno) + 1
        elseif foldlevel(lineno) > foldlevel(lineno - 1)
        \ && foldlevel(lineno) == a:opens_level
            execute lineno."foldclose"
            let lineno = foldclosedend(lineno) + 1
        else
            let lineno = lineno + 1
        end
    endwhile
endfunction
nnoremap <silent> z1 :%foldclose<cr>
nnoremap <silent> z2 :call <sid>CloseFoldOpens(2)<cr>
nnoremap <silent> z3 :call <sid>CloseFoldOpens(3)<cr>
nnoremap <silent> z4 :call <sid>CloseFoldOpens(4)<cr>
nnoremap <silent> z5 :call <sid>CloseFoldOpens(5)<cr>

Я предпочитаю пронумерованные карты, но для ваших на основе отступа текущей строки, что-то вроде этих строк:

nnoremap <silent> z. :call <sid>CloseFoldOpens(foldlevel('.'))<cr>zv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...