Я использую vim для редактирования исходного кода Informix 4GL, который имеет такой синтаксис:

FUNCTION
  FOR ...
  ...
  END FOR
END FUNCTION

Я хочу сложить функции с помощью ZA ZM и т.д.

Это работает

  :set foldmarker=FUNCTION,END\ FUNCTION
  :set foldmethod=marker

Однако ключевые слова также могут быть в нижнем регистре, и я в идеале хотел бы также сложить MAIN.END MAIN, поэтому маркеры не могут этого сделать.

Я старался

:syn region myFun start="FUNCTION" end="END FUNCTION" transparent fold
:set foldmethod=syntax

но это не имело никакого эффекта. У меня уже есть файл синтаксиса, который делает цветную подсветку и :syn показал, что myFun включен в определения синтаксиса.

Как я могу настроить независимое от регистра свертывание синтаксиса FUNCTION ...КОНЕЦ ФУНКЦИИ и ОСНОВНЫЕ.КОНЕЦ ГЛАВНАЯ?


Обновление: я пробовал http://www.vim.org/scripts/script.php?script_id=2287, но у него есть некоторые проблемы:

  • Это складывается на уровне детализации, я не хочу (IF , FOR , WHILE , ...)
  • Предполагается, что операторы END начинаются с новой строки (поэтому, IF a<b call c() END IF сбрасывается в EOF)
  • Он считает, что SELECT * FROM table \n FOR UPDATE является началом инструкции FOR

Поэтому я хотел бы сначала попытаться создать что-то более простое.

1 ответ1

1

Я думаю, что вы должны определить свою собственную функцию свертывания, чтобы у вас был больший контроль над тем, что сворачивается, когда. Следующая функция сгиба не учитывает регистр function/end function и должна быть довольно легко настраиваемой для дальнейших требований:

function! InformixFold()
  let line      = getline(v:lnum)
  let prev_line = getline(v:lnum-1)

  if match(line, '^\s*function\s*$') >= 0
    return 1
  elseif match(prev_line, '^\s*end\s*function\s*$') >= 0
    return 0
  else
    return "="
endfunction

Затем установите foldmethod для expr и foldexpr для функции:

set foldmethod=expr
set foldexpr=InformixFold()

Смотрите help fold-expr для более подробной информации.

"Скриншот":

- FUNCTION
|   FOR ...
|   ...
|   END FOR
| END FUNCTION

+ +--  5 lines: FUNCTION------------------------------------------------------

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