【问题标题】:How to compose region like "<?php foo; bar; ?>"如何组成像“<?php foo; bar; ?>”这样的区域
【发布时间】:2011-05-29 07:24:57
【问题描述】:

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

到 >>>> {{PHP}}

{{PHP}}

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

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

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

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

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

【问题讨论】:

    标签: emacs php-mode


    【解决方案1】:

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

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

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

    这会将&lt;?php foo bar?&gt;( 之类的内容显示为Ƥ(

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

    正则表达式的文档在Emacs manual

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

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

    【讨论】:

    • 谢谢 :) 我想匹配多行并使用:。它在“Regexp I-search”中运行良好。但它在 lisp 中不起作用:"".
    • @lot:确保您使用正确数量的反斜杠(您的评论缺少一些,但可能是由于 Stack Overflow 对 cme​​ts 中反斜杠的奇怪处理),并设置 font-lock-multiline。跨度>
    【解决方案2】:

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

    在这种情况下,请查看yasnippet (more info on emacswiki)。它可以让你像 P 一样定义自己的 sn-ps(语法非常简单),让它有占位符(这样你可以在调用 sn-p 时用其他东西替换 xxx;xxx;)等等。它真的很方便。只需创建一个新的 sn-p (文件的名称表明它是快捷方式,即,将其命名为 P 在本例中)并输入如下内容:

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

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

    【讨论】:

    • 谢谢,对不起我的英语:P 我想找一个正则表达式来匹配 并编写它。然后我的 php 模板就更清楚了:

      Ƥ

      。 Ƥ 是 阻止。
    • 你可以通过发出命令M-x yas/reload-all来避免重启emacs
    猜你喜欢
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多