“ syntax-ppss”适合什么语言?


12

我一直在寻找一种方法,通过查看当前缓冲区的字体设置来检测注释上是否存在点。

Smartparens定义sp-point-in-comment依赖于syntax-ppss。然而,似乎syntax-ppssparse-partial-sexp可用于任意语言,即使他们不使用s表达式。

例如,以下Python:

x = 1
# I'm a comment
y = 2

将点放在评论和评估中(if (nth 4 (syntax-ppss)) 'comment 'not-comment)可以正常工作。

是否syntax-ppss适用于任何编程模式?为什么文档字符串讨论s表达式?


1
并不是我已经对此进行了详尽的探讨,但是我还没有找到一种无法使用的语言。即使在诸如乳胶之类的文本模式下,它对我来说也很好用。
马拉巴巴2014年

Answers:


13

好吧,从某种意义上来说,s表达式本质上是“抽象语法”,因为它们只是抽象语法树的具体语法,因此任何语言都可以表示为s表达式,并可以通过s表达式命令进行操作。因此,syntax-ppss谈到“表达式”只是讨论抽象语法树的Lisp方法。

但是实际上,syntax-ppss通常不适用于任何模式。它从根本上针对类似于Lisp的语言,并且如果某种语言的具体语言与Sexps的差异太大,那么使用Sexp命令来操纵该语言就不再有意义。可以,但是抽象表示和具体语法之间的差距太大,这会使大多数命令违反直觉。

但是,的某些基础架构syntax-ppss是相当通用的。主要模式通常会尝试将其插入,因为这使它们可以与许多内置的Emacs功能很好地配合使用,并为Smartparens等其他第三方软件包提供通用接口。

值得注意的是,syntax-ppss依赖语法表来获取字符串和注释。语法表按其语法类别将各个字符分类。有成对的定界符,字符串定界符和注释字符的类。

在几乎所有编程语言中,字符串和注释的结构都非常相似:字符串通常用特殊的定界符括起来。注释也可以具有特殊的定界符,或者以特定字符开头并延伸到行尾。这些结构可以很容易地在语法表中捕获,并且几乎所有主要模式都定义了适当的语法表,如果只是为了从Emacs的句法强化中受益。

因此,syntax-ppss几乎可以在任何语言中对字符串和注释都适用,但是其他功能的支持和“有用性”各不相同。


4

除了@lunaryorn的答案,我认为语法-ppss仅依赖于emacs语法表系统的健壮性,该系统可在大多数语言中用于注释和字符串。但是,如果该语言具有语法表无法捕获的语法,并且如果该模式未构建将语法属性添加到正确位置的解析器,syntax-ppss则会失败。

试试这个html-mode

<p class="aa" id='bb'>"cc" 'dd'</p>

并调用以下命令:

(defun inside-string-p (&optional pos)
  "Return non-nil if inside string, else nil.
This depends on major mode having setup syntax table properly."
  (interactive)
  (let ((result (nth 3 (syntax-ppss pos))))
    (print result)
    result))

只有aa是正确的,但是bb也应该是正确的。

在中时nxml-mode,没有一个返回true,但至少a应该为true。

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.