如何在Emacs中折叠html标签?

时间:2015-04-05 23:59:26

标签: html regex emacs elisp

我正在使用hs-minor-mode和fold-dwim模式。

通过设置变量hs-special-modes-alist,我在下面的正则表达式中添加了匹配html标签:

(html-mode "<\([A-Za-z][A-Za-z0-9]*\)[^>]*>.*?" "</\1>" "-->" nil nil)
;; Format: (MODE START END COMMENT-START FORWARD-SEXP-FUNC ADJUST-BEG-FUNC)

但是当我在html文件中使用它(使用命令fold-dwim-toggle。)时没有任何效果。


以下是我的.emacs文件中的相关部分:

;; hideshow
(setq hs-special-modes-alist
  (mapcar 'purecopy
  '((c-mode "{" "}" "/[*/]" nil nil)
    (c++-mode "{" "}" "/[*/]" nil nil)
    (bibtex-mode ("@\\S(*\\(\\s(\\)" 1))
    (java-mode "{" "}" "/[*/]" nil nil)
    (js-mode "{" "}" "/[*/]" nil)
    ;; (html-mode "<!-- {{{ " "<!-- }}} -->" " -->" nil t)
    (html-mode "<\([A-Za-z][A-Za-z0-9]*\)[^>]*>.*?"  "</\1>" "-->" nil nil) ;gw: self edited, see blw ref:
    ;; http://www.regular-expressions.info/examples.html
    )))

2 个答案:

答案 0 :(得分:2)

我不熟悉hs-special-modes-alist。但是简单地看一下源代码,我没有看到任何暗示END模式可以引用BEGIN模式的子组的东西,我认为,这是通过使用{{1}来尝试做的事情。 }}。我猜你希望"</\1>"\1模式的第一个子组匹配的任何东西替换。

代码中BEGIN的所有示例都没有使用子组匹配编号(例如hs-special-modes-alist)。而且医生说\1本身就是一个正则表达式。据推测,它与结尾匹配,与END匹配,与开头匹配。

文档确实提到START本身“START形式的列表,其中(COMPLEX-START MDATA-SELECTOR)是一个带有多个部分的正则表达式 COMPLEX-START一个整数,指定哪个子匹配是正确的 在调用MDATA-SELECTOR之前调整点的位置。

我认为这不会立即与您想要的内容相对应,但至少它表示使用子组匹配。也许您可以使用它来匹配开始和结束标记。我没有进一步研究代码,例如了解hs-forward-sexp-func的使用位置和方式。

另外,你通常需要在Lisp字符串中加倍反斜杠。因此,如果您需要hs-forward-sexp-func,则可能需要使用\1。同样,对于"</\\1>" - 使用\(

也许这会让你对你想要的东西更进一步。

(注意,顺便说一下,regexp是一种尝试解析HTML代码之类的东西的糟糕方式。)

答案 1 :(得分:0)

我在这里回答了这个问题:Does emacs offer hide show for html mode,但是又来了。

我为mhtml-mode编写了此代码,它工作得很好,它可以按标签折叠HTML以及嵌入式CSS和JS。只需将其添加到您的emacs配置文件中,即可开始使用。

;; When called this automatically detects the submode at the current location.
;; It will then either forward to end of tag(HTML) or end of code block(JS/CSS).
;; This will be passed to hs-minor-mode to properly navigate and fold the code.
(defun mhtml-forward (arg)
  (interactive "P")
  (pcase (get-text-property (point) 'mhtml-submode)
    ('nil (sgml-skip-tag-forward 1))
    (submode (forward-sexp))))

;; Adds the tag and curly-brace detection to hs-minor-mode for mhtml.
(add-to-list 'hs-special-modes-alist
             '(mhtml-mode
               "{\\|<[^/>]*?"
               "}\\|</[^/>]*[^/]>"
               "<!--"
               mhtml-forward
               nil))

正则表达式细目:

  • "{\\|<[^/>]*?":匹配{或任何打开的HTML标记。它与开头标签中的结尾>匹配,但不包括结尾<script>。这样就可以将<style>"}\\|</[^/>]*[^/]>"标签视为HTML标签,而不是JS或CSS。

  • }:匹配[Route("MyController?Command=DoTask1")] public IHttpActionResult Task1() { return Ok(); } [Route("MyController?Command=DoTask2")] public IHttpActionResult Task2() { return Ok(); } .... 或结束标记。