왜 메이저 모드가 얼굴을 검사하지 않습니까?


10

메이저 모드를 작성할 때 종종 '문자열의 포인트?'를 아는 것이 유용합니다. '의견에 요점이 있습니까?'.

대부분의 주요 모드는 프로그래밍 언어를 구문 분석하려고 시도하는 것 같습니다. 예를 들면 다음과 같습니다.

  • python-syntax-content 전화 syntax-ppss
  • haskell-fill-paragraph전화 syntax-ppss및re-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

답변:


12

문제는 더 강력하지 않다는 것입니다.

첫째, 주요 모드는 정확히 주석이나 문자열을 결정하는 책임입니다. 글꼴 잠금을 위해 성공적으로 정의 할 수 있으면 다른 목적으로도 동일한 작업을 수행 할 수 있어야합니다.

둘째, 포인트가 내부에있는 컨텍스트를 판별하기 위해 구문을 읽는 것이 올바르게 수행되면 더 강력한 방법입니다. 실패한 인스턴스를 찾은 경우 주요 모드 작성자에게 버그 보고서를 제출하는 것이 좋습니다.


얼굴 검사가 덜 견고한 이유는 일부 상황에서는 실패 할 수 있기 때문입니다.

  1. 초보자의 경우 사용자가 비활성화 할 수 있지만 font-lock-mode(거대한 버퍼 일 수 있음) font-lock-mode활성화 된 경우에도 얼굴이 다소 불안정합니다.

  2. 또한 사용자는 주석을 font-lock-keywords강조 표시 TODO하는 것과 같이 일부를 추가하는 부 모드를 가질 수 있습니다 . 또는 글꼴 잠금이 버퍼를 글꼴로 지정한 후 일부면을 동적으로 적용하는 부 모드가있을 수 있습니다.

요약하면 주 모드는 해당 모드로 정의 된면이 현재 적용된면임을 보증하지 않습니다.


2

가장 큰 이유는 font-lock이을 사용하기 때문 syntax-ppss입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.