我想要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和按下标签。魔法! :)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top