質問

PHPテンプレートファイルの折りたたみPHPブロックが必要です。

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

to >>>>

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

最初に、私はFont-Lock-Add-Keywordsを使用しようとしますが、失敗しました。 @gilles for(サポート?アドバイス?どちらの言葉がここにあるべきかわかりません、ごめんなさい)に感謝します。

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

次に、以下で試してみてください。

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

持っている場合はエラーを見せてください、ありがとうXD

役に立ちましたか?

解決

あなたのregexpには簡単な間違いがあります: ? 特別なキャラクターですが、文字通りそれを一致させたいので、その前にバックスラッシュが必要です。文字列の文字通りの引用とregexpの引用は直交であるため、regexpのバックスラッシュは文字列リテラルで2倍にする必要があることに注意してください。

さらに、regexpsは貪欲です .* あなたが別の発生がある場合、部分はあなたが意図した以上に一致するかもしれません ?>( 後で行。交換する場合 .[\n>], 、これにより、試合が最初から延長されないようになります >. 。 23以上のEMACSを使用する場合は、代わりに非グリーディオペレーターを使用して、できるだけ早く試合を停止できます。 .*?.

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

これは次のことを示します <?php foo bar?>( なので Ƥ(.

バックスラッシュされた括弧 \(\) regexpでグループを区切ります。 (match-beginning 1)(match-end 1) 最初の(および唯一の)グループの境界位置を返します。

Regexpsのドキュメントはにあります EMACSマニュアル.

試合を複数の行に拡張したい場合は、必要です [^>]* また \\(.\\|\n\\)*? regexpで。さらに、Font Lockライブラリに複数の行に検索を拡張するように指示する必要があります(デフォルトでは、効率的な理由で、行の最後のすべての検索を制限します)。これを使って:

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

他のヒント

だから、あなたはaを入力したい P そして、それは次のようなものを出力するはずです <?php xxx; xxx; ?>?私はあなたの質問を正しく理解しましたか?

その場合、チェックしてください yasnippet (Emaswikiの詳細)。 Pのように、独自のスニペット(構文は本当に簡単です)を定義できます。 xxx;xxx; スニペットを呼ぶときに何か他のものと)など。本当に便利です。新しいスニペットを作成するだけです(ファイルの名前はショートカットであると指定します。つまり、名前を付けます P この例)と次のようなものを入力します。

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

独自のフォントロックを作成する必要はなく、Regexpを使用する必要はありません。新しいスニペットを作成するだけです。作成した後(そしてロードした後、私は通常、私が怠けているのでエマックを再起動します)あなたのスニペット、 php-mode バッファ、タイプP、プレスタブ。魔法! :)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top