web-dev-qa-db-fra.com

Indentation correcte de HTML et PHP en utilisant Vim

J'utilise Vim depuis un certain temps et je ne parviens pas à obtenir une bonne indentation HTML dans les fichiers PHP.

Par exemple, ce que je veux, c'est que chaque enfant soit mis en retrait d'un onglet de plus que son parent, comme indiqué ci-dessous.

<?php
if(isset($sports)) {
    //Do something
?>
<div>
    <label>Uniform Size</label>
    <ul>
        <li class="left"><label for="s" class="small">S</label><input type="radio" name="size[]" value="S" id="s" class="radio" /></li>
        <li class="left"><label for="m" class="small">M</label><input type="radio" name="size[]" value="M" id="m" class="radio" /></li>
        <li class="left"><label for="l" class="small">L</label><input type="radio" name="size[]" value="L" id="l" class="radio" /></li>
        <li class="left"><label for="xl" class="small">XL</label><input type="radio" name="size[]" value="XL" id="xl" class="radio" /></li>
    </ul>
</div>
<?php
}
?>

En utilisant PHP-correct-Indent script, le code est formaté comme suit:

<?php
if(isset($sports)) {
    //Do something
?>
<div>
<label>Uniform Size</label>
<ul>
<li class="left"><label for="s" class="small">S</label><input type="radio" name="size[]" value="S" id="s" class="radio" /></li>
<li class="left"><label for="m" class="small">M</label><input type="radio" name="size[]" value="M" id="m" class="radio" /></li>
<li class="left"><label for="l" class="small">L</label><input type="radio" name="size[]" value="L" id="l" class="radio" /></li>
<li class="left"><label for="xl" class="small">XL</label><input type="radio" name="size[]" value="XL" id="xl" class="radio" /></li>
</ul>
</div>
<?php
}
?>

Même avec du HTML indenté auquel j'ajoute ensuite du code PHP, l'indentation est ignorée, déplaçant de nouvelles lignes de code HTML sans aucune indentation.

Alors, est-il possible d'obtenir le format d'indentation que je souhaite utiliser avec HTML dans des fichiers PHP, à l'aide de Vim?

48
Sasha

Cela me dérange toujours. J'ai seulement juste décidé que la meilleure solution (pour moi personnellement) est la suivante:

:set filetype=html

Et ensuite mettez en surbrillance votre texte et appuyez sur =. BOOM! Le formatage HTML est un succès. (Pas idéal, je sais, mais au moins ça marche.)

53
steve

Il existe un ensemble d’instructions vimrc sur le wiki Vim appelé Meilleur support de mise en retrait pour PHP avec HTML qui utilisera le bon plugin en fonction du bloc.

Il existe également un Vundle/Pathogen Plugin qui utilise le même code mais est plus facile à installer et maintient votre .vimrc propre.

Agent pathogène

cd ~/.vim/bundle
git clone https://github.com/captbaritone/better-indent-support-for-php-with-html.git

Vundle

Place dans .vimrc

Bundle 'captbaritone/better-indent-support-for-php-with-html'

Courir dans vim

:BundleInstall
20
Brian Carper

Après avoir étudié très sérieusement toutes les solutions, j'ai découvert ce plugin:

http://www.vim.org/scripts/script.php?script_id=604

Il semble avoir résolu mes problèmes !!!!!

19
alessioalex

Pour moi, cela fonctionne bien si je fais d'abord :set ft=html, puis :set syn=php.

9
gitaarik

En php + html j'ai trouvé ce qui suit est bon pour moi.

:set ft=html # Change the file type to html
=G # to indent all lines 
:set ft=phtml # Change the file type to phtml
=G # to indent all php lines
5
shin

j'ai trouvé cette solution bien meilleure . http://www.vim.org/scripts/script.php?script_id=1120

supportant le style html HEREDOC. qui se produisent fréquemment dans mon code.
BTW: il a plus de versions que l’ancienne (script id 604, alex l’a posté ci-dessus)

1
xinquan

php-correct-indenting ne s'intéresse qu'à votre PHP et suppose que la lisibilité du code HTML ne présente aucun intérêt. Un pénétrateur XML positionnerait bien les balises, mais ne pourrait pas indenter le contenu d'une instruction de traitement <? Php> pour correspondre. Il existe peut-être un script d'indentation qui comprend à la fois la syntaxe C-like de PHP le langage de programmation et le langage de balisage [X] [HT] ML, mais je n'en ai jamais rencontré - désolé.

Néanmoins, je voudrais jouer avec l'indentation de votre exemple avant même que l'indentation php-correct-correcte ne soit modifiée! L'élément <div> est à l'intérieur d'une instruction if externe, mais je n'ai aucun moyen de voir cela à partir de l'indentation. Je suggérerais quelque chose comme:

<?php if(isset($sports)) { ?>
    <?php
        // Do something
    ?>
    <div>
        <label>Uniform Size</label>
        <ul>
            <li>etc. etc.</li>
        </ul>
    </div>
<?php } ?>
1
bobince

dans votre .vimrc:

:function IndentPHPHTML()
:  set ft=html
:  normal gg=G
:  set ft=php
:endfunction

utilisez ctrl-shift-L (ou autre) pour mettre en retrait

nnoremap <C-S-l> :call IndentPHPHTML()<cr>
0
Ricardo Schalch

Après avoir cherché pendant des jours la solution, rien n’a fonctionné et finalement cela a fonctionné, ajoutez ceci à votre vimrc

au BufEnter,BufNew *.php :set filetype=html
0
kapil