为什么主要模式不只是检查面部?


10

编写主模式时,知道“字符串中是否指向点?”通常很有用。“在评论中有意思吗?”。

大多数主要模式似乎都试图解析编程语言。例如:

  • python-syntax-content 来电 syntax-ppss
  • haskell-fill-paragraph呼叫syntax-ppssre-search-forward
  • c-in-comment-line-prefix-p 移动点并呼叫 looking-at
  • sp-point-in-comment通话,syntax-ppss但还会检查是否在评论分隔符上

但是,这在某些情况下不起作用。在组织模式缓冲区中,这些方法无法正确检测源块中的注释。

这似乎也毫无意义,因为缓冲区已经显示了高亮的注释

取而代之,您可以简单地检查以下点的人脸:

(defun wh--get-faces (pos)
  "Get all the font faces at POS."
  (remq nil
        (list
         (get-char-property pos 'read-face-name)
         (get-char-property pos 'face)
         (plist-get (text-properties-at pos) 'face))))

(defun wh-string-p (pos)
  "Return non-nil if POS is inside a string."
  (memq 'font-lock-string-face (wh--get-faces pos)))

为什么主要模式不这样做?缓冲区已经被字体化了,所以我希望它更快,更健壮并且需要更少的代码。


1
我喜欢这个问题。但是,如果您不使用该font-lock-mode怎么办?(不是我认为您应该这样做。)
mbork 2014年

Answers:


12

问题在于它没有更强大。

首先,主要模式正是负责决定什么是注释或字符串的模式。如果他们能够成功地出于锁定字体的目的定义它们,则他们应该能够为其他目的而做同样的事情。

其次,如果正确完成,阅读语法来确定该点在内部的上下文是更可靠的方法。如果您发现失败的实例,则值得向主要模式作者提交错误报告。


检查面部的能力较差的原因是,在某些情况下它可能会失败。

  1. 对于初学者来说,用户可能已禁用font-lock-mode(可能是一个巨大的缓冲区),但是即使font-lock-mode启用,用户的面部也会有些不稳定。

  2. 同样,用户可以具有添加一些辅助模式的次要模式font-lock-keywords(例如TODO在注释中突出显示)。或者在字体锁将缓冲区字体化后,可能有一个次要模式可以动态应用某些面孔。

总之,主模式不能保证由其定义的面是当前应用的面。


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.