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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top