Несколько фолдметодов в vim


9

Я довольно часто использую опцию сворачивания vim и обычно устанавливаю метод сгибания в синтаксис. Недавно я обнаружил, что можно добавлять пользовательские сгибы, такие, что я могу помещать целые блоки, /*{{{*/и /*}}}*/это очень полезно для группировки больших разделов исходного файла. Однако, чтобы использовать эту функцию, мне нужно установить метод метки на маркер, и я потерял свертывание синтаксиса.

Можно ли одновременно иметь два активных метода сгиба в vim? set foldmethod=syntax,markerне работает.

Ответы:


4

Нет, строго говоря, в Vim нельзя одновременно активировать несколько фолдметодов.

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

  1. Команды для создания / удаления сгиба («zf», «zd» и т. Д.), Которые работают с методами маркера и ручного свертывания, не будут работать, если для метода сгиба задано «синтаксис».

  2. Эмулировать маркеры, которые "форсируют" уровень сгиба (например, " {{{1" / " }}}1"), в отличие от увеличения / уменьшения уровня сгиба на один (например, " {{{" / " }}}") проблематично; либо вы должны полностью игнорировать числа уровней сгиба, либо воспользоваться возможностью, что вы будете вмешиваться - и, возможно, нарушать - остальные правила свертывания на основе синтаксиса.

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


2

Я искал то же самое. Поскольку я не хочу взламывать файл синтаксиса, вместо этого у меня есть отображение для переключения между методами сгиба. Прямо сейчас я переключаюсь только между синтаксисом и маркером:

nmap <Leader>ff :call <SID>ToggleFold()<CR>
function! s:ToggleFold()
    if &foldmethod == 'marker'
        let &l:foldmethod = 'syntax'
    else
        let &l:foldmethod = 'marker'
    endif
    echo 'foldmethod is now ' . &l:foldmethod
endfunction
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.