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

822
RedGrittyBrick

Я использую 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заявления

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

0
Какой это язык? digitxp 13 лет назад 0
Informix 4GL. Я нашел файл синтаксиса для него, но он складывается больше, чем я хочу (операторы IF), имеет ошибки (например, когда «END IF» в той же строке, что и «IF»), или считает «SELECT * FROM table FOR UPDATE» в качестве начала За цикл) и не сбрасывает ФУНКЦИЮ! (хотя файл, кажется, содержит код для сворачивания функций) RedGrittyBrick 13 лет назад 0
Вы пробовали `set foldmethod = indent`? romainl 13 лет назад 0
@romainl: я не имел, но у меня есть сейчас. Это не идеально для меня, но полезно. Благодарю. RedGrittyBrick 13 лет назад 0

1 ответ на вопрос

1
Thor

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