如何撰写“ <?php foo”之类的区域;酒吧; ?>”
题
我想要php模板文件中的折叠php块。
<html> <?php $bar = foo(); echo $bar; ?> <h1><?php echo $title; ?></h1> </html> to >>>> <html> {{PHP}} <h1>{{PHP}}</h1> </html>
首先,我尝试使用字体 - 锁定键 - 它失败。非常感谢@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
解决方案
您的言论中有一个简单的错误: ?
是一个特殊的角色,但是您想从字面上匹配它,因此您需要后斜切。请注意,字符串文字引号和REGEXP引用是正交的,因此Regexp Backslash需要在字符串字面上加倍。
此外,沟通很贪婪,所以 .*
如果您发生的另一个事件 ?>(
后来在线。如果您更换 .
经过 [\n>]
, ,这将防止比赛延伸超过第一个 >
. 。如果您使用emacs≥23,则可以使用非绿色操作员,以尽早停止比赛: .*?
.
"\\(<\\?php [^\n>]* \\?>\\)("
这将显示像 <?php foo bar?>(
作为 Ƥ(
.
后刷括号 \(
…\)
在REGEXP界限中; (match-beginning 1)
和 (match-end 1)
返回第一个(和唯一)组的边界位置。
Regexps的文档在 emacs手册.
如果您希望比赛跨多行扩展,则需要 [^>]*
或者 \\(.\\|\n\\)*?
在Regexp中。此外,您必须告诉字体锁库将其搜索扩展到多行(默认情况下,出于效率原因,它都会限制所有搜索的搜索)。用这个:
(eval-after-load 'php-mode
'(progn
(setq font-lock-multiline t)
(font-lock-add-keywords …)))
其他提示
因此,您想输入 P
它应该输出类似的东西 <?php xxx; xxx; ?>
?我正确理解您的问题吗?
在这种情况下,请查看 Yasnippet (有关emacswiki的更多信息)。它使您可以定义自己的片段(语法真的很容易),例如p,让它具有占位符(因此您可以替换 xxx;
和 xxx;
在调用摘要时使用其他内容)。真的很方便。只需创建一个新片段(文件的名称决定了它的快捷方式,即 P
这个示例)并输入类似的内容:
# name: My own P-snippet.
# --
<?php ${first}; ${second}; ?>
无需制作自己的字体锁,无需使用REGEXP。只需创建一个新的片段即可。创建(加载它,我通常会重新启动Emacs,因为我很懒惰)您的片段,打开一个 php-mode
缓冲区,键入P和按下标签。魔法! :)