9

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

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

2 ответа2

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .