Vim: независимый от языка возврат к свертыванию синтаксиса с помощью foldmethod = expr - PullRequest
0 голосов
/ 03 января 2019

Моя цель состоит в том, чтобы расширить foldmethod=syntax с помощью моего собственного пользовательского правила.

Мой подход заключается в том, чтобы использовать foldmethod=expr и определить это правило в моем foldexpr (например,добавить сгиб для комментариев «///»).После этого ресурсы, которые я обнаружил, обычно возвращаются к чему-то похожему на складывание отступов.Так есть ли хороший способ вернуться к свертыванию синтаксиса после пользовательских правил, не воспроизводя полную грамматику для того языка, который я использую?

Пока я пытаюсь это сделать, что не очень удовлетворительное приближениесвертывание синтаксиса:

function! GetFold(lnum)
  let this_line=getline(a:lnum)
  let pprev_i=indent(a:lnum - 2)/&shiftwidth
  let prev_i=indent(a:lnum - 1)/&shiftwidth
  let this_i=indent(a:lnum)/&shiftwidth
  " comments
  if this_line =~? '^\s*\/\/\/.*'
    return this_i + 1
  endif
  " like indent folding, but includes the closing bracket line to the fold
  if empty(this_line) 
    if prev_i < pprev_i
      return prev_i
    endif
    return -1
  endif 
  if this_i < prev_i
    return prev_i
  endif
  return this_i
endfunction

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Нет, нет способа заставить Вима "отступить";только один 'foldmethod' может быть активным одновременно, и нет API для оценки другого метода сгиба «как если бы».

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

Это громоздко и, возможно, медленно;Я бы не рекомендовал это.

0 голосов
/ 03 января 2019

Решение состоит в том, чтобы просто использовать set fold=syntax и добавить область синтаксиса для комментариев к вашему .vimrc.Там вы можете использовать ключевое слово fold, чтобы пометить регион как складной (см. :h syn-fold для получения дополнительной информации):

 syn region myFold start="///" end="///" transparent fold  

(Обратите внимание, посмотрите также на :h syn-transparent, это весьма полезно здесь)

...