2009-02-19 8 views
3

J'essaye d'éditer des dossiers avec vim et obtiens le POD automatiquement plié (juste le POD, pas le Perl).Comment puis-je autofold POD en Perl avec vim?

Je ne peux pas le faire fonctionner, alors je l'ai essayé de désactiver tous mes plugins et mon .vimrc avec ceci:

vim -u NONE some_perl.pl 

Je suppose que mes blocs de POD dans mon projet avec démarrage avec ' = head1 ',' = head2 'ou' = head3 '. Ils finiront toujours par '= couper'.

Ensuite, en mode de commande, type I tapez ce qui suit:

:setf perl 
:syntax on 
:set foldenable 
:syn region POD start=/^=head[123]/ end=/^=cut/ fold 

C'est l'identification du POD parce que le POD devient blanc alors que le reste de la coloration syntaxique reste, mais il ne plier le POD.

J'ai essayé ci-dessus avec différentes combinaisons de:

:syn-sync-first 

Et:

:syn sync fromstart 

Mais pas de chance.

Je sais que le pliage fonctionne parce que je peux mettre en surbrillance manuellement les lignes et taper 'zF' et il se plie correctement.

Quelqu'un peut-il nous éclairer à ce sujet? Plus important encore, comment puis-je déboguer cela?

Répondre

8

Vous avez oublié

: se foldmethod = syntaxe

+0

Il ne fonctionne que si je ne parviens pas à charger mon .vimrc. Malheureusement, je n'arrive pas à comprendre comment déboguer ce qui cause le conflit. Pourtant, c'est un pas de plus. Merci! – Ovid

+0

Commentez la moitié du fichier.Si cela fonctionne, le problème est dans cette moitié. Répéter. – jrockway

+0

@jrockway D'oh! Je vais devoir le faire avec mes plugins, aussi. Ce sont ceux qui seront une douleur, mais oui, je vais comprendre comment faire fonctionner ce travail :) – Ovid

2

Coller ce qui suit à la fin de votre fichier ~/.vimrc:

fu! MyFoldSettings() 
    set foldmethod=expr 
    set foldexpression=MyFoldLevel(v:lnum) 
    set foldenable 
    set foldminlines=1 
endf  

fu! MyFoldLevel(lev) 
    let mytext = getline(a:lev) 
    let result="=" 
    if mytext =~ '^=item' 
     let result=">3" 
    elsei mytext =~ '^=back' 
     let result="<2" 
    elsei mytext =~ '^=over' 
     let result=">2" 
    elsei mytext =~ '^=cut' 
     let result="<1" 
    elsei mytext =~ '^=\w\+' 
     let result='>1' 
    en  
    return result 
endf 

augroup MyFoldSettings_AutoCommands 
    au! 
    au BufReadPost {*.pl,*.pod,*.pm} MyFoldSettings() 
augroup END 

Cela devrait fonctionner dans La plupart des cas - C'est juste un exemple rapide et sale, mais vous pouvez en ajouter plus si vous avez besoin de plus de fonctionnalités. En outre, pour assurer que cette option est activée, vous pouvez ajouter le modeline:

# vim:fen:fdo=hor:fcl=all:fdm=expr:fde=MyFoldLevel(v:lnum):fml=1 

Si vous ne voyez pas le texte plié à ce point, essayez de régler le « foldopen = hor » et « foldclose = all » qui rendre la navigation dans/hors des plis plus facile. En outre, si vous avez besoin que ceci soit appliqué à d'autres fichiers ou à des types de fichiers, vous pouvez configurer l'au (autocommande) en conséquence. À votre santé.

0

Vous pouvez mettre dans votre .vimrc:

au FileType perl 
    \ setlocal foldexpr=getline(v:lnum)=~'^=cut'?'<1':getline(v:lnum)=~'^='?'1':'=' | 
    \ setlocal foldmethod=expr 
0

Il suffit de définir les variables perl_fold_ *, la syntaxe perl du système surligneur prendra soin du reste.

Dans Vimrc, il suffit d'ajouter

let perl_fold = 1 laisser perl_fold_blocks = 1