Indentation correcte de HTML et PHP en utilisant Vim

J'utilise Vim depuis un moment, et je n'arrive pas à obtenir une indentation HTML correcte dans les fichiers PHP.

Par exemple, ce que je veux, c'est que chaque enfant soit indenté 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 le script PHP-correct-Indent , 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 le HTML indenté auquel j'ajoute ensuite du code PHP, l'indentation est ignorée, déplaçant de nouvelles lignes de code HTML sans indentation à tout.

Alors, est-il possible que je puisse obtenir le format d'indentation que je veux travailler avec HTML dans les fichiers PHP, en utilisant Vim?

45
demandé sur Sasha 2009-01-20 01:39:48

10 réponses

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

:set filetype=html

Puis mettez en surbrillance votre texte et appuyez sur =. BOOM! HTML formatage succes. (Pas idéal, je sais, mais au moins ça marche.)

51
répondu steve 2010-11-03 07:49:30

Il y a un ensemble d'instructions vimrc sur le Wiki vim appelé Meilleur support de retrait pour PHP avec HTML qui utilisera le plugin correct en fonction du bloc.

Il existe également un Plugin Vundle/Pathogen 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'

Exécuter dans vim

:BundleInstall
20
répondu Brian Carper 2015-08-19 12:17:07

Après avoir regardé vraiment vraiment dur dans 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
répondu alessioalex 2011-05-13 20:31:13

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

9
répondu gitaarik 2017-10-10 11:42:58

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
répondu shin 2014-01-07 13:05:31

Php-correct-indenting ne se soucie que de votre PHP, et suppose que la lisibilité du HTML n'a aucun intérêt. Un pénétrateur XML positionnerait bien les balises, mais ne pourrait pas indenter le contenu d'un instruction de traitement pour correspondre. Peut-être qu'il y a un script d'indentation qui comprend à la fois la syntaxe de type C de PHP le langage de programmation et [X] [HT]ML le langage de balisage en cours de template , mais je n'en ai jamais rencontré encore-désolé.

Encore, je voudrais jouer avec le indenting dans votre exemple avant même que php-correct-indenting l'ait malmené! L'élément

est à l'intérieur d'une instruction if externe, mais je n'ai aucun moyen de le voir à partir de l'indentation. Je suggère quelque chose comme:
<?php if(isset($sports)) { ?>
    <?php
        // Do something
    ?>
    <div>
        <label>Uniform Size</label>
        <ul>
            <li>etc. etc.</li>
        </ul>
    </div>
<?php } ?>
1
répondu bobince 2009-01-20 01:51:56

J'ai trouvé cette solution est beaucoup mieux. http://www.vim.org/scripts/script.php?script_id=1120

Prise en charge du style HTML HEREDOC. qui se produisent fréquemment dans mon code.
BTW: il a plus de versions que l'ancienne (id de script 604, alex l'a posté ci-dessus)

1
répondu xinquan 2011-09-21 03:10:05

À l'intérieur de votre .vimrc:

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

Utilisez ctrl-shift - L (ou autre) pour indenter

nnoremap <C-S-l> :call IndentPHPHTML()<cr>
0
répondu Ricardo Schalch 2016-03-28 16:05:26

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

au BufEnter,BufNew *.php :set filetype=html
0
répondu kapil 2016-12-30 02:47:51

Dans votre fichier ~/.vimrc:

set expandtab
set sw=4
set ts=4

L'option expandtab convertit les onglets en espaces, l'option sw définit la largeur de votre décalage sur 4 et le ts définit l'arrêt de tabulation sur 4 espaces.

-8
répondu Naum 2009-01-20 00:47:46