Un problema con le funzioni bash pieghevoli in vim
Domanda
Ho un file di script bash che inizia con una definizione di funzione, come questa:
#!/bin/bash
# .....
# .....
function test {
...
...
}
...
...
Uso vim 7.2 e ho impostato g: sh_fold_enabled = 1
in modo tale che la piegatura sia abilitata con bash. Il problema è che la piegatura del test funzionale non è terminata correttamente, cioè dura fino alla fine del file. Sembra qualcosa del genere:
#!/bin/bash
# .....
# .....
+-- 550 lines: function test {----------------------------------------
~
~
La funzione stessa è di circa 40 righe e voglio qualcosa che assomigli a questo ("immagini" dicono più di mille parole, dicono ...):
#!/bin/bash
# .....
# .....
+-- 40 lines: function test {----------------------------------------
...
...
...
~
~
Qualcuno conosce una buona soluzione a questo problema?
Soluzione
Ho fatto alcune ricerche e ho trovato un modo per risolvere il problema: per impedire a vim di piegare le funzioni fino alla fine del file, ho dovuto aggiungere un'istruzione skip alla regione di sintassi per shExpr
(nel file sh.vim
, solitamente posizionato da qualche parte come / usr / share / vim / vim70 / syntax /
):
syn region shExpr ... start="{" skip="^function.*\_s\={" end="}" ...
Questa modifica impedisce al file di sintassi di pensare che {
e }
appartengano al gruppo shExpr, quando in realtà appartengono al gruppo di funzioni. O è così che l'ho capito, comunque.
Nota: questa correzione funziona solo per la seguente sintassi:
function test
{
....
}
e non per questo:
function test {
....
}
Una soluzione rapida e sporca per l'ultimo bug è rimuovere shExpr dal cluster @shFunctionList.
Altri suggerimenti
Dovrebbe funzionare, ma sembra che ci sia un bug nel file di sintassi. La regione di piegatura inizia effettivamente dalla parola "funzione" e cerca di continuare fino alla chiusura "}", ma l'evidenziazione per la regione "{...}" prende il sopravvento sulla chiusura "}" e la piega continua a cercare un'altra uno. Se aggiungi un altro "}" puoi vederlo in azione:
function test {
...
}
}
Sembra esserci una soluzione più semplice su Reddit .
Per citare l'autore nel post:
Le opzioni che utilizzo sono:
syntax=enable filetype=sh foldmethod=syntax let g:sh_fold_enabled=3 g:is_sh=1
EDIT: soluzione alternativa
vim -u NONE -c 'let g: sh_fold_enabled = 7' -c ': set fdm = sintassi' -c 'sy su 'file.sh
g: sh_fold_enabled = 4 sembrava essere il livello concordato concordato nella discussione. Questa soluzione funziona perfettamente per me. Non ho dovuto modificare il file di sintassi.
Modifica: g: sh_fold_enabled = 5 è in realtà quello giusto. Non 4. Inoltre, come mostrato nel poster su Reddit, questi comandi devono precedere qualsiasi altra impostazione in vimrc, ad eccezione dei plugin.