Как определить свертывание синтаксиса 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------------------------------------------------------