我正在使用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
)))
答案 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();
}
....
或结束标记。