我想在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
答案 0 :(得分:2)
那么,你想输入一个P
,它应该输出像<?php xxx; xxx; ?>
这样的东西吗?我是否正确理解了您的问题?
在这种情况下,请查看yasnippet(more 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 …)))