1

PHPテンプレートファイルでPHPブロックを折り畳みたい。

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

>>>>へ

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

まず、font-lock-add-keywords を使用しようとしましたが、失敗しました。@Gilles に感謝します (サポート? アドバイス? どの単語をここに入れるべきかわかりません、申し訳ありません)。

(eval-after-load 'php-mode
  '(プログン
     (setq font-lock-multiline t)
     (font-lock-add-keywords
      'php-mode `(("\\(<?php .* ?>\\)("
                   (0 (progn (compose-region (マッチ開始 1)
                                             (試合終了 1) "の")
                             なし))))))))

次に、以下を試します。動作します。

(defun lot/php-hide ()
  「バッファにphpブロックを作成」
  (相互の作用)
  (バッファの先頭)
  (while (re-search-forward "\\(<\\?php\\(.\\|\n\\)*?\\?>\\)" nil t)
    ;; (make-overlay (マッチ開始 0) (マッチ終了 0))
    ;; (非表示領域非表示)
    ;; 'hide-region-hide' が機能しないので、compose-region を試してください
    (compose-region (match-beginning 0)
                    (試合終了 0)
                    ;; "{{PHP}}" ; 言葉を完璧に使うことはできません。
                    「の」
                    )
    )
  )

エラーがある場合は表示してください。ありがとう XD

4

2 に答える 2

2

では、a を入力するPと、次のように出力されるはず<?php xxx; xxx; ?>です。あなたの質問を正しく理解しましたか?

その場合は、 yasnippetをチェックしてください(詳細は emacswiki を参照)。P のような独自のスニペット (構文は非常に簡単です) を定義したり、プレースホルダーを持たせたり (スニペットを呼び出すときにxxx;andを別のものに置き換えることができます) したりできます。xxx;本当に便利です。新しいスニペットを作成し (ファイルの名前はショートカットを示します。つまり、Pこの例では名前を付けます)、次のように入力します。

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

独自のフォント ロックを作成する必要はなく、正規表現を使用する必要もありません。新しいスニペットを作成するだけです。スニペットを作成した後 (そしてそれを読み込んだ後、私は怠け者なので通常は emacs を再起動します)、php-modeバッファーを開き、P と入力してタブを押します。魔法!:)

于 2010-12-22T10:38:39.117 に答える
2

あなたの正規表現には単純な間違いがあります:?は特殊文字ですが、文字どおりに一致させたいので、その前にバックスラッシュが必要です。文字列リテラルの引用と正規表現の引用は直交しているため、文字列リテラルでは正規表現のバックスラッシュを 2 倍にする必要があることに注意してください。

さらに、正規表現は貪欲であるため、行.*の後半に別の出現がある場合、その部分は意図した以上に一致する可能性があります?>(。で置き換える.[\n>]、一致が最初の を超えて拡張するのを防ぎ>ます。Emacs ≥23 を使用している場合は、代わりに貪欲でない演算子を使用して、できるだけ早く一致を停止できます.*?

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

のようなものが表示<?php foo bar?>(されƤ(ます。

バックスラッシュ付きの括弧\(…<code>\) は、正規表現でグループを区切ります。最初の (そして唯一の) グループの境界位置を返します(match-beginning 1)(match-end 1)

正規表現のドキュメントは、Emacs のマニュアルにあります。

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

 (eval-after-load 'php-mode
   '(progn
      (setq font-lock-multiline t)
      (font-lock-add-keywords …)))
于 2010-12-22T21:30:35.797 に答える