Проблема со сворачиванием функций bash в vim
Вопрос
У меня есть файл сценария bash, который начинается с определения функции, например:
#!/bin/bash
# .....
# .....
function test {
...
...
}
...
...
Я использую vim 7.2, и я установил g: sh_fold_enabled = 1
так, чтобы сворачивание было включено с помощью bash. Проблема в том, что сворачивание функционального теста не завершается правильно, то есть длится до конца файла. Это выглядит примерно так:
#!/bin/bash
# .....
# .....
+-- 550 lines: function test {----------------------------------------
~
~
Сама функция занимает всего около 40 строк, и мне нужно что-то, похожее на это («изображения», скажем, больше, чем тысячи слов, они говорят ...):
#!/bin/bash
# .....
# .....
+-- 40 lines: function test {----------------------------------------
...
...
...
~
~
Кто-нибудь знает хорошее решение этой проблемы?
Решение
Я провел некоторое исследование и нашел способ решить проблему: чтобы запретить vim свернуть функции до конца файла, мне пришлось добавить оператор пропуска в область синтаксиса для shExpr
(в файле sh.vim
, обычно размещается где-то вроде / usr / share / vim / vim70 / syntax /
):
syn region shExpr ... start="{" skip="^function.*\_s\={" end="}" ...
Это изменение не дает синтаксическому файлу думать, что {
и }
принадлежат группе shExpr, когда они фактически принадлежат группе функций. Или, во всяком случае, я так понял.
Примечание. Это исправление работает только для следующего синтаксиса:
function test
{
....
}
и не для этого:
function test {
....
}
Быстрое и грязное исправление последней ошибки - удаление shExpr из кластера @shFunctionList.
Другие советы
Это должно сработать, но, похоже, в файле синтаксиса есть ошибка. Область сгиба фактически начинается со слова «функция» и пытается перейти к закрывающему «}», но выделение области «{...}» занимает закрывающее «}», и сгиб продолжается при поиске другого один. Если вы добавите еще один '}', вы увидите это в действии:
function test {
...
}
}
Кажется, есть простое решение для Reddit . р>
Цитировать автора в посте:
Я использую следующие варианты:
syntax=enable filetype=sh foldmethod=syntax let g:sh_fold_enabled=3 g:is_sh=1
РЕДАКТИРОВАТЬ: Обходной путь
vim -u НЕТ -c 'let g: sh_fold_enabled = 7' -c ': установить fdm = синтаксис' -c 'sy на 'file.sh
g: sh_fold_enabled = 4, по-видимому, было согласованным уровнем сгиба в обсуждении. Это решение отлично работает для меня. Мне не нужно было редактировать файл синтаксиса.
Изменить: g: sh_fold_enabled = 5 на самом деле правильный. Не 4. Кроме того, как показано на плакате в Reddit, эти команды должны идти перед любыми другими настройками в vimrc, кроме плагинов.