Pregunta

Quiero bloque php veces en el archivo de plantilla php.

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

to >>>>

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

En primer lugar, trato de utilizar font-lock-add-palabras clave, que falló. Muchas gracias a @Gilles para (apoyo? Consejo? No sé qué palabra debe estar aquí, lo siento).

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

A continuación, trato a continuación, funciona.

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

Muéstrame el error si tiene, gracias XD

¿Fue útil?

Solución

Hay un error simple en su expresión regular: ? es un carácter especial, pero que desea hacer coincidir literalmente, por lo que necesita una barra invertida antes de ella. Tenga en cuenta que literal de cadena citando y citando expresiones regulares son ortogonales, por lo que las necesidades de barra invertida expresión regular que se duplicaron en un literal de cadena.

Además, las expresiones regulares son codiciosos, por lo que la parte .* puede coincidir más de lo previsto si tiene otra ocurrencia de ?>( más adelante en la línea. Si se reemplaza por . [\n>], esto evitará que el partido se extienda más allá de la primera >. Si utiliza Emacs =23, se puede utilizar un operador no expansivo en cambio, a parar el partido tan pronto como sea posible:. .*?

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

Esto mostrará cosas como <?php foo bar?>( como Ƥ(.

El paréntesis \( ... \) en una expresión regular delimitan un grupo de barra invertida; (match-beginning 1) y (match-end 1) devuelven las posiciones de los límites para la primera (y única) de grupo.

La documentación de las expresiones regulares está en el manual Emacs .

Si desea que el partido se extienda a través de múltiples líneas, es necesario [^>]* o \\(.\\|\n\\)*? en la expresión regular. Además, debe informar a la biblioteca Font Lock para extender sus búsquedas en varias líneas (por defecto, que limita todas las búsquedas en el extremo de la línea, por razones de eficiencia). Utilice la siguiente:

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

Otros consejos

Por lo tanto, desea introducir un P y se debe hacer salir algo así como <?php xxx; xxx; ?>? ¿He entendido bien su pregunta?

En ese caso, visita yasnippet ( más información sobre EmacsWiki ). Se le permite definir sus propios fragmentos (la sintaxis es muy fácil) como P, hacer que tenga marcadores de posición (para que pueda reemplazar xxx; y xxx; con otra cosa cuando se llama al fragmento) y tal. Es realmente útil. Basta con crear un nuevo fragmento (el nombre de los dictados de archivos que de acceso directo, es decir, el nombre de P que este ejemplo) y introduzca algo como:

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

No hay necesidad de hacer que el propietario de Font-cerraduras, sin necesidad de uso de expresiones regulares. Basta con crear un nuevo fragmento. Después de crear (y su carga, que por lo general emacs reinicio ya que soy perezoso) el fragmento, abre un buffer php-mode, escriba P y presiona el tabulador. ¡Magia! :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top