Frage

Ich will fold php Block in PHP Template-Datei.

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

to >>>>

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

Als erstes versuche ich font-lock-Add-Keywords zu verwenden, es ist fehlgeschlagen. Vielen Dank an @Gilles für (Unterstützung? Beratung? Ich weiß nicht, welches Wort hier sein sollte, sorry).

(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)))))))

Dann versuche ich unten, es funktioniert.

(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.
                    "の"
                    )
    )
  )

Zeigen Sie mir den Fehler, wenn haben, danken Ihnen XD

War es hilfreich?

Lösung

Es gibt einen einfachen Fehler in Ihrem regulären Ausdruck: ? ein Sonderzeichen ist, aber Sie wollen es buchstäblich passen, so dass Sie einen umgekehrten Schrägstrich, bevor es brauchen. Beachten Sie, dass Stringliteral zitiert und regexp zitiert sind orthogonal, so dass die regexp Backslash Bedürfnisse in einem Stringliteral verdoppelt werden.

Darüber hinaus sind regexps gierig, so der .* Teil mehr kann passen, als Sie gedacht, wenn Sie ein anderes Auftreten von ?>( hat später auf der ganzen Linie. Wenn Sie . durch [\n>] ersetzen, wird dies das Spiel verhindert über den ersten > aus erstreckt. Wenn Sie Emacs =23 verwenden, können Sie einen nicht gierigen Operator stattdessen verwenden, um das Spiel zu stoppen so früh wie möglich. .*?

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

Diese Dinge wie <?php foo bar?>( als Ƥ( zeigen wird.

Die backslashed Klammern \( ... \) in einem regexp abgrenzen eine Gruppe; (match-beginning 1) und (match-end 1) gibt die Grenzpositionen für die erste (und einzige) Gruppe.

Die Dokumentation von regexps ist in dem Emacs Handbuch .

Wenn Sie das Spiel wollen über mehrere Zeilen erstrecken, müssen Sie in der regexp [^>]* oder \\(.\\|\n\\)*?. Darüber hinaus müssen Sie die Font-Lock-Bibliothek erzählen seine Suche auf mehreren Linien zu erweitern (standardmäßig begrenzt sie alle Suchvorgänge am Ende der Leitung, aus Effizienzgründen). Verwenden Sie diese:

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

Andere Tipps

Also, wollen Sie Eingabe, um eine P und es ausgeben sollte so etwas wie <?php xxx; xxx; ?>? Habe ich verstehe Ihre Frage richtig?

In diesem Fall überprüfen yasnippet ( weitere Informationen über emacswiki ). Damit können Sie Ihre eigenen Snippets definieren (die Syntax ist wirklich einfach) wie P, lassen Sie es Platzhalter hat (so Sie xxx; und xxx; mit etwas anderem ersetzen können, wenn die Snippet Aufruf) und so weiter. Es ist wirklich praktisch. Erstellen Sie einfach einen neuen Code-Schnipsel (den Namen der Datei diktiert es der Verknüpfung, das heißt, nennen Sie es P es in diesem Beispiel) und Eingabe so etwas wie:

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

Keine Notwendigkeit, eigene font-Schlösser zu machen, keine Notwendigkeit, den Einsatz regexp. Erstellen Sie einfach einen neuen Code-Schnipsel. einen php-mode Puffer, geben Sie P und die Tabulatortaste drücken Sie nach dem Erstellen (und Laden, ich in der Regel Neustart Emacs, da ich bin faul) Ihr Snippet öffnen. Magie! :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top