Un problème avec les fonctions de bash de pliage dans vim
Question
J'ai un fichier de script bash qui commence par une définition de fonction, comme ceci:
#!/bin/bash
# .....
# .....
function test {
...
...
}
...
...
J'utilise vim 7.2 et j'ai défini g: sh_fold_enabled = 1
de sorte que le repliement soit activé avec bash. Le problème est que le pliage du test de fonction n’est pas terminé correctement, c’est-à-dire qu’il dure jusqu’à la fin du fichier. Cela ressemble à quelque chose comme ça:
#!/bin/bash
# .....
# .....
+-- 550 lines: function test {----------------------------------------
~
~
La fonction elle-même a à peu près 40 lignes et je veux quelque chose qui ressemble à ceci ("les images" en disent plus que mille mots, dit-on ...):
#!/bin/bash
# .....
# .....
+-- 40 lines: function test {----------------------------------------
...
...
...
~
~
Quelqu'un connaît-il une bonne solution à ce problème?
La solution
J'ai effectué des recherches et trouvé un moyen de résoudre le problème: pour empêcher vim de replier les fonctions jusqu'à la fin du fichier, je devais ajouter une instruction skip à la région de syntaxe pour shExpr
(dans le fichier sh.vim
, généralement placé quelque part comme / usr / share / vim / vim70 / syntaxe /
):
syn region shExpr ... start="{" skip="^function.*\_s\={" end="}" ...
Cette modification empêche le fichier de syntaxe de penser que les codes {
et }
appartiennent au groupe shExpr, alors qu'ils appartiennent réellement au groupe de fonctions. Ou c’est ce que j’ai compris de toute façon.
Remarque: cette correction ne fonctionne que pour la syntaxe suivante:
function test
{
....
}
et pas pour cela:
function test {
....
}
Pour résoudre le dernier bogue, le correctif rapide consiste à supprimer shExpr du cluster @shFunctionList.
Autres conseils
Cela devrait fonctionner, mais il semble y avoir un bogue dans le fichier de syntaxe. La région de pliage commence en fait au mot 'fonction' et tente de continuer jusqu'à la fermeture '}', mais la mise en surbrillance de la région '{...}' prend en charge la fermeture '}' et le repli continue en recherchant une autre un. Si vous ajoutez un autre '}', vous pouvez le voir en action:
function test {
...
}
}
Il semble exister une solution plus simple sur Reddit .
Pour citer l'auteur dans le message:
Les options que j'utilise sont les suivantes:
syntax=enable filetype=sh foldmethod=syntax let g:sh_fold_enabled=3 g:is_sh=1
EDIT: solution de contournement
vim -u NONE -c 'let g: sh_fold_enabled = 7' -c ': set fdm = syntaxe' -c 'sy sur 'fichier.sh
g: sh_fold_enabled = 4 semblait être le niveau de pli convenu dans la discussion. Cette solution fonctionne parfaitement pour moi. Je n'ai pas eu à modifier le fichier de syntaxe.
Edit: g: sh_fold_enabled = 5 est en fait le bon. Pas 4. De plus, comme l'a montré l'affiche sur Reddit, ces commandes doivent précéder tout autre paramètre de vimrc, à l'exception des plug-ins.