1

我想在 php 模板文件中折叠 php 块。

  <html>
<?php
  $bar = foo();
  回声 $bar;
?>
  <h1><?php 回显 $title; ?></h1>
  </html>

到 >>>>

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

首先,我尝试使用 font-lock-add-keywords,它失败了。非常感谢@Gilles 的(支持?建议?我不知道这里应该用哪个词,抱歉)。

(eval-after-load 'php-mode
  '(预测
     (setq font-lock-multiline t)
     (字体锁定添加关键字
      'php 模式 `(("\\(<?php .* ?>\\)("
                   (0 (progn (compose-region (match-beginning 1)
                                             (比赛结束1)“の”)
                             零)))))))

然后,我在下面尝试,它有效。

(defun lot/php-hide ()
  “在缓冲区中编写 php 块”
  (交互的)
  (缓冲区开始)
  (while (re-search-forward "\\(<\\?php\\(.\\|\n\\)*?\\?>\\)" nil t)
    ;; (make-overlay (match-beginning 0) (match-end 0))
    ;; (隐藏区域隐藏)
    ;; 'hide-region-hide' 不起作用,所以尝试 compose-region
    (compose-region (match-beginning 0)
                    (比赛结束 0)
                    ;; "{{PHP}}" ; 用词不能完美。
                    “の”
                    )
    )
  )

如果有错误,请告诉我,谢谢XD

4

2 回答 2

2

所以,你想输入一个P,它应该输出类似的东西<?php xxx; xxx; ?>?我是否正确理解了您的问题?

在这种情况下,请查看yasnippet有关 emacswiki 的更多信息)。它可以让你定义自己的片段(语法非常简单),比如 P,让它有占位符(这样你可以在调用片段时用其他东西替换xxx;和)等等。xxx;它真的很方便。只需创建一个新片段(文件的名称表示它的快捷方式,即,P在本示例中将其命名)并输入如下内容:

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

无需制作自己的字体锁,无需使用正则表达式。只需创建一个新片段。创建(并加载它,我通常重新启动 emacs,因为我很懒)你的代码片段后,打开一个php-mode缓冲区,输入 P 并按 Tab。魔法!:)

于 2010-12-22T10:38:39.117 回答
2

你的正则表达式有一个简单的错误:?是一个特殊字符,但你想按字面意思匹配它,所以你需要一个反斜杠。请注意,字符串文字引用和正则表达式引用是正交的,因此正则表达式反斜杠需要在字符串文字中加倍。

此外,正则表达式是贪婪的,因此如果您稍后.*再次出现该部分,则该部分可能会比​​您预期的更多。?>(如果您替换.[\n>],这将防止匹配超出第一个>。如果您使用 Emacs ≥23,您可以使用非贪婪运算符来代替,以尽早停止匹配:.*?.

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

这将显示<?php foo bar?>(Ƥ(.

正则表达式中的反斜线括号\(...<code>\) 分隔组;(match-beginning 1)(match-end 1)返回第一个(也是唯一一个)组的边界位置。

正则表达式的文档在Emacs 手册中。

如果您希望匹配扩展到多行,则需要[^>]*\\(.\\|\n\\)*?在正则表达式中。此外,您必须告诉 Font Lock 库将其搜索扩展到多行(出于效率原因,默认情况下,它将所有搜索限制在行尾)。用这个:

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