如何组成像“<! - ?php foo; bar;? - >”这样的区域

时间:2010-12-22 09:23:11

标签: emacs php-mode

我想在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(支持?建议?我不知道应该在哪里,对不起)。

(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

2 个答案:

答案 0 :(得分:2)

那么,你想输入一个P,它应该输出像<?php xxx; xxx; ?>这样的东西吗?我是否正确理解了您的问题?

在这种情况下,请查看yasnippetmore info on emacswiki)。它允许您定义自己的片段(语法非常简单),如P,让它有占位符(这样您可以在调用片段时用其他内容替换xxx;xxx;)等等。这真的很方便。只需创建一个新片段(文件名称决定它的快捷方式,即在此示例中将其命名为P)并输入如下内容:

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

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

答案 1 :(得分:2)

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

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

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

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

regexp中的反斜杠括号\( ... \)分隔一个组; (match-beginning 1)(match-end 1)返回第一个(也是唯一一个)组的边界位置。

正则表达式的文档位于Emacs manual

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

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