Как определить свертывание синтаксиса vim для исходного кода Informix 4GL?

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

ФУНКЦИЯ
  ЗА......
  КОНЕЦ ДЛЯ
КОНЕЦ ФУНКЦИИ

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

Это работает

: set foldmarker = FUNCTION,END\ FUNCTION: установить метод метки = маркер

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

Я старался

:syn region myFun start="FUNCTION" end="END FUNCTION" прозрачная складка:set foldmethod= синтаксис

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

Как я могу настроить независимое от регистра свертывание синтаксиса FUNCTION...END FUNCTION и MAIN..END MAIN?


Обновление: я пытался 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 ответ

Решение

Я думаю, что вы должны определить свою собственную функцию сворачивания, чтобы у вас был больший контроль над тем, что сворачивается, когда. Следующая функция складывания складывается 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------------------------------------------------------
Другие вопросы по тегам