Domanda

Voglio blocco php volte nel file di modello di PHP.

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

to >>>>

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

In primo luogo, cerco di usare font-lock-add-parole chiave, non è riuscito. Molte grazie a @Gilles per (sostegno? Consiglio? Non so quale parola dovrebbe essere qui, mi spiace).

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

Poi, cerco qui di seguito, funziona.

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

Mostrami l'errore se avere, grazie XD

È stato utile?

Soluzione

C'è un semplice errore nella vostra regexp: ? è un carattere speciale, ma si desidera abbinare alla lettera, quindi è necessario un backslash prima di lui. Si noti che stringa letterale citando e regexp citando sono ortogonali, così i bisogni regexp backslash per raddoppiare in un letterale stringa.

Inoltre, espressioni regolari sono avidi, in modo che la parte .* può corrispondere più di quanto previsto se si dispone di un'altra occorrenza di ?>( in seguito sulla linea. Se si sostituisce . da [\n>], questo impedirà il match si estenda oltre il primo >. Se si utilizza Emacs =23, è possibile utilizzare un operatore non avido, invece, per fermare la partita il più presto possibile:. .*?

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

Questo mostrerà cose come <?php foo bar?>( come Ƥ(.

Il backslash parentesi \( ... \) in una espressione regolare delimitano un gruppo; (match-beginning 1) e (match-end 1) ritornano le posizioni di confine per la prima (e unica) del gruppo.

La documentazione di espressioni regolari è nel manuale Emacs .

Se si desidera che la partita di estendere su più righe, è necessario [^>]* o \\(.\\|\n\\)*? nel regexp. Inoltre, è necessario dire la Biblioteca della fonte blocco di estendere le sue ricerche su più linee (per impostazione predefinita, si limita tutte le ricerche alla fine della linea, per ragioni di efficienza). Utilizzare questa:

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

Altri suggerimenti

Quindi, si vuole inserire un P e dovrebbe uscita qualcosa come <?php xxx; xxx; ?>? Ho capito la tua domanda correttamente?

In questo caso, il check-out yasnippet ( più informazioni emacswiki ). Esso consente di definire i propri frammenti (la sintassi è davvero facile) come P, lasciare che hanno segnaposto (in modo da poter sostituire xxx; e xxx; con qualcos'altro quando si chiama il frammento) e così via. E 'davvero a portata di mano. Basta creare un nuovo frammento di (il nome dei dettami di file che di scelta rapida, vale a dire, il nome P in questo esempio) e l'ingresso qualcosa di simile:

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

Non c'è bisogno di fare proprie di font-serrature, senza necessità di utilizzare regexp. Basta creare una nuova snippet. Dopo aver creato (e il caricamento, ho emacs solito riavvio dato che io sono pigro) lo snippet, aprire un buffer php-mode, digitare P e premi sul tasto tab. Magia! :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top