Question

Je veux bloc php fois dans le fichier de template php.

  <html>
<?php
  $bar = foo();
  echo $bar;
?>
  <h1><?php echo $title; ?></h1>
  </html>

to >>>>

  <html>
  {{PHP}}
  <h1>{{PHP}}</h1>
  </html>

Tout d'abord, je tente d'utiliser la police add-lock-mots clés, il a échoué. Un grand merci à @Gilles pour (soutien? Conseil? Je ne sais pas quel mot devrait être ici, désolé).

(eval-after-load 'php-mode
  '(progn
     (setq font-lock-multiline t)
     (font-lock-add-keywords
      'php-mode `(("\\(<?php .* ?>\\)("
                   (0 (progn (compose-region (match-beginning 1)
                                             (match-end 1) "の")
                             nil)))))))

Alors, j'essaie ci-dessous, cela fonctionne.

(defun lot/php-hide ()
  "compose php block in buffer"
  (interactive)
  (beginning-of-buffer)
  (while (re-search-forward "\\(<\\?php\\(.\\|\n\\)*?\\?>\\)" nil t)
    ;; (make-overlay (match-beginning 0) (match-end 0))
    ;; (hide-region-hide)
    ;; 'hide-region-hide' doesn't work, so try compose-region
    (compose-region (match-beginning 0)
                    (match-end 0)
                    ;; "{{PHP}}" ; use word can't work perfect.
                    "の"
                    )
    )
  )

Montrez-moi l'erreur si avoir, Je vous remercie XD

Était-ce utile?

La solution

Il y a une simple erreur dans votre regexp: ? est un caractère spécial, mais vous voulez faire correspondre littéralement, vous avez besoin d'une contre-oblique. Notez que la chaîne littérale et citant regexp citant orthogonaux, de sorte que les besoins backslash regexp être doublée dans un littéral de chaîne.

En outre, les expressions régulières sont gourmands, donc la partie .* peut correspondre plus que vous vouliez si vous avez une autre occurence de ?>( plus tard sur la ligne. Si vous remplacez . par [\n>], cela empêchera le match d'étendre au-delà de la première >. Si vous utilisez Emacs =23, vous pouvez utiliser un opérateur non gourmand à la place, d'arrêter le match le plus tôt possible. .*?

"\\(<\\?php [^\n>]* \\?>\\)("

Cela montrera des choses comme <?php foo bar?>( comme Ƥ(.

Les parenthèses backslashés \( ... \) dans une expression rationnelle délimitent un groupe; (match-beginning 1) et (match-end 1) renvoient les positions de limite pour le premier groupe (et unique).

La documentation de regexps est dans le manuel Emacs .

Si vous voulez le match d'étendre sur plusieurs lignes, vous avez besoin [^>]* ou \\(.\\|\n\\)*? dans l'expression rationnelle. De plus, vous devez indiquer à la bibliothèque de verrouillage de la police d'étendre ses recherches sur plusieurs lignes (par défaut, elle limite toutes les recherches à la fin de la ligne, pour des raisons d'efficacité). Utilisez ceci:

 (eval-after-load 'php-mode
   '(progn
      (setq font-lock-multiline t)
      (font-lock-add-keywords …)))

Autres conseils

, vous voulez saisir un P et doit générer quelque chose comme <?php xxx; xxx; ?>? Ai-je bien compris votre question?

Dans ce cas, consultez yasnippet ( plus d'informations sur emacswiki ). Il vous permet de définir vos propres extraits (la syntaxe est très simple) comme P, laissez-il des espaces réservés (vous pouvez remplacer xxx; et xxx; autre chose lorsque vous appelez l'extrait) et tel. Il est vraiment à portée de main. Il suffit de créer un nouvel extrait (le nom du fichier indique raccourci est tout, à savoir, nommez-P il cet exemple) et quelque chose d'entrée comme:

# name: My own P-snippet.
# --
<?php ${first}; ${second}; ?>

Pas besoin de faire propre police verrous, pas besoin d'utiliser regexp. Il suffit de créer un nouvel extrait. Après avoir créé (et le chargement, je emacs habituellement redémarrage depuis que je suis paresseux) votre extrait, ouvrez un tampon de php-mode, tapez onglet P et appuyez sur. La magie! :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top