부 모드에서 복잡한 구문 강조 표시를 추가하는 방법은 무엇입니까?


10

마이너 모드에서 다양한 얼굴의 코드를 강조하고 싶습니다.

여기 내가 원하는 것에 가까운 스크린 샷이 있습니다.

파이썬 구문 강조

내가 부족 한 가지는 주석 문자 갖는 #에서을 font-lock-comment-face. 아이디어는 일반 텍스트로 강조 표시된 개요에 "포함"되는 주석을 작성하여보다 쉽게 ​​읽을 수 있도록하는 것입니다. 평소 덜 눈에 띄는 얼굴로 정기적으로 의견을 나누면서.

내가 사용한 코드는 다음과 같습니다.

(setq-local font-lock-defaults
            '(python-font-lock-keywords
              nil nil nil nil
              (font-lock-syntactic-face-function
               . lpy-font-lock-syntactic-face-function)))

(defun lpy-font-lock-syntactic-face-function (state)
  "Return syntactic face given STATE.
Returns 'defalt face for comments that belong to an outline."
  (cond ((nth 3 state)
         (if (python-info-docstring-p state)
             font-lock-doc-face
           font-lock-string-face))
        ((save-excursion
           (while (and (> (point) (point-min))
                       (progn (move-beginning-of-line 0)
                              (eq (char-after) ?\#))))
           (forward-line 1)
           (looking-at "#\\*+ "))
         'default)
        (t
         font-lock-comment-face)))

문제는 font-lock-syntactic-face-function복잡한 데이터 구조를 수신 state하고 다른 포인트 상태를 가지며 얼굴을 반환하는 것 외에는 작동 하는 인터페이스에 대한 단서가 없다는 것입니다 .

누군가이 인터페이스를 설명 할 수 있습니까? 아마도 더 좋은 것이 있습니까?

답변:


6

font-lock-syntactic-face-functionFont Lock,보다 구체적으로 Syntactic Font Lock 단계 (강조 광산) 의 일반 변수입니다 .

이 변수가 0이 아닌 경우 주어진 구문 요소 (문자열 또는 주석)에 사용할면을 결정하는 함수 여야합니다. 값은 일반적으로 font-lock-defaults의 other-vars 요소를 통해 설정됩니다.

이 함수는에 의해 리턴 된 지점의 구문 분석 상태 인 하나의 인수로 호출되며 parse-partial-sexpface를 리턴해야합니다 . 기본값은 주석의 경우 font-lock-comment-face와 문자열의 경우 font-lock-string-face를 반환합니다 (Font Lock의 Faces 참조).

parse-partial-sexp차례로 Emacs의 현재 구문 상태를 설명하는 목록을 리턴합니다. 이는 기본적으로 구문 테이블을 현재 버퍼에 적용한 결과입니다. 목록은 다소 복잡하므로 여기서는 여기에서 제외하겠습니다. 의 docstring에서 완전한 참조를 볼 수 있습니다 parse-partial-sexp. 이 기능의 목적은 특정 규칙에 따라 구문 요소에 적용되는 얼굴을 변경하는 것입니다. 함수의 시작 부분에서이를 보여줍니다. 현재 문자열이 docstring 인 경우 다른면을 사용하십시오.

그러나 얼굴은 항상 전체 구문 요소, 즉 전체 문자열 또는 주석에 적용됩니다. 이 기능으로 개별 부품을 강조 표시 할 수 없으며 코드에서 state와 같이이 목적을 위해서만 주어진 부분 을 보아야 (python-info-docstring-p state)합니다. 마십시오 하지 이 곳에서 포인트를 사용; point이 글꼴 잠금 단계에서 값 이 올바르게 정의되어 있는지 여부조차 확실하지 않습니다 .


조각을 합치면 목적에 따라 잘못된 기능을 사용하고 있기 때문에 작동하지 않을 수 있습니다.

나는 당신이 원하는 하이라이트를 구현하려고 시도하지 않았지만, 당신은 너무 깊이 파고 들었다고 생각합니다. 내용을 올바르게 이해하면 주석의 개요를 강조하는 것과 같습니다.

내가 옳다면 font-lock-keywords특별한 방법으로 필요합니다 .

(my/find-outline-in-comment-p 0 'outline-face t)

outline-face헤드 라인에 적용 할 얼굴은 어디에 있고, t이 위치에서 이전의 글꼴 잠금을 무시하는 것을 의미하며 , 위치를 잡고 주석에서 첫 번째 윤곽선을 검색 my/find-outline-in-comment하는 매처 함수 (의 docstring 참조 font-lock-defaults) 사이에 (point)그 위치, 윤곽의 범위를 반환하는 경기 데이터에 강조한다.

개요를 찾으려면 주석 (스캔 font-lock-comment-face또는 구문 상태)을 스캔 한 다음 looking-at주석에 개요가 있는지 확인하는 데 사용 합니다.


1

다음 font-lock-syntactic-face-function과 같이 정의하십시오 .

(setq font-lock-syntactic-face-function
      (lambda (state)
    (cond ((nth 3 state)
           font-lock-string-face)
          ((and (nth 4 state)(nth 8 state))
            MY-COMMENT-FACE
          (t  font-lock-comment-face))))

이것은 python-mode.el로 테스트되었으며 섹션은 주석이없는 "# *"로 시작합니다.

(setq py--font-lock-syntactic-face-function
      (lambda (state)
    (cond ((nth 3 state)
           font-lock-string-face)
          ((and (nth 4 state)(nth 8 state)
            (progn (save-excursion
                 (goto-char (nth 8 state))
                 (looking-at (concat comment-start (regexp-quote "*"))))))
           nil)
          (t font-lock-comment-face))))

모드로 관리되는 동안 :

(font-lock-syntactic-face-function
                    . py--font-lock-syntactic-face-function)

대신 nil유효한 얼굴이 작동해야합니다.

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