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


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

답변:


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.