如何检测是否在配对中?


16

问:有没有一种通用的方法来检测点是否在匹配的字符对内?

也就是说:是否有一个通用的谓词功能(或某些功能)可以确定点是在匹配对之间还是某些任意选择的字符之间?我正在考虑一种可以参考t以下情况的评估方案!

"!"   (quotes in general)
``!'' (LaTeX quotes)
$!$   (LaTeX math)
(!)   (lisp parens)
*!*   (org emphasis)

编辑syntax-ppss似乎是一个很好的起点,但对我来说尚不清楚如何使它适应多字符匹配对(例如``LaTeX引号'',甚至是matched <b>html tags</b>)。我想知道是否有一个通用的解决方案,或者是否需要一个专用的解析器。

Answers:


16

syntax-ppss在这里可能会有所帮助。它返回一个包含以下元素的列表

  • 元素0:以深度为单位
  • 元素3:如果在字符串中,则为非零

您可以这样使用它:

(or (> (nth 0 (syntax-ppss)) 0)
    (nth 3 (syntax-ppss)))

通过在缓冲区中正确设置语法表(用于字符串和匹配的括号),该函数应该可以实现您所期望的。如果无法使用模式的语法表,则可以使用with-syntax-table


我应该指出,docstring 比我链接到的Elisp手册部分更详细地parse-partial-sexp解释了由所返回的数据结构syntax-ppss
辣椒粉

2

例如,如果要检查大括号之间是否使用,请使用以下命令:

(and (looking-back "{") (looking-at "}"))

当然,您可以根据需要替换花括号。

编辑:

一个更有用的功能将与此相似:

(defun test-inside-curly-braces ()
 (interactive)
 (when (and (looking-back "{\\(.*?\\)") (looking-at "\\(.*?\\)}"))
  (message "inside curly braces")))

2
仅当点在结束处时才有效},并且之间没有任何关系{}。正确使用正则表达式配对定界符可能很棘手。最好syntax-pps按照@paprika的建议使用。
泰勒

@Tyler仅在关闭点}不是我见过的行为时才起作用:\但是,是的,使用正则
表达式

looking-at检查从点开始的文本。除非}您在上面的第一个陈述中指出了问题,否则不起作用?Emacs版本之间可能有所不同。:/
泰勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.