Проблема со сворачиванием функций bash в vim

StackOverflow https://stackoverflow.com/questions/413015

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть файл сценария 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, кроме плагинов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top