`syntax-ppss`는 어떤 언어에 적합합니까?


12

현재 버퍼의 글꼴이 어떻게 표시되는지 확인하여 포인트가 주석에 있는지 여부를 감지하는 방법을 찾고 있습니다.

Smartparens는 다음 sp-point-in-comment에 의존하는 것을 정의합니다 syntax-ppss. 그러나, 그 보인다 syntax-ppss그리고 parse-partial-sexp그들이 사용하는 S-표현하지 않더라도, 임의의 언어로 사용할 수 있습니다.

예를 들어,이 파이썬 :

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

주석 안에 점을 배치하고 평가하는 것이 (if (nth 4 (syntax-ppss)) 'comment 'not-comment)올바르게 작동합니다.

syntax-ppss모든 프로그래밍 모드 에서 작동 합니까 ? docstring이 왜 s-expressions에 대해 논의합니까?


1
나는 이것을 철저히 탐구하지는 않았지만 아직 작동하지 않는 언어를 찾지 못했습니다. 라텍스와 같은 텍스트 파생 모드에서도 잘 작동했습니다.
Malabarba

답변:


13

음, s- 표현식은 본질적으로 추상 구문 트리에 대한 구체적인 구문이라는 의미에서 "추상적 인 구문"이므로 모든 언어를 s- 표현식으로 표현하고 s- 표현식 명령으로 조작 할 수 있습니다. 따라서 syntax-ppss"Sexps"라고 말하는 것은 추상 구문 트리에 대해 말하는 Lisp 방식입니다.

그러나 실제로 syntax-ppss는 어떤 모드에서도 일반적으로 작동하지 않습니다. 기본적으로 Lisp와 유사한 언어를 대상으로하며 언어의 구체적인 언어가 Sexps에서 너무 많이 벗어나면 더 이상 Sexp 명령을 사용하여 언어를 조작하는 것이 의미가 없습니다. 그것은 효과가 있지만 추상 표현과 구체적인 구문 사이에는 너무 큰 차이가있어 대부분의 명령을 반 직관적으로 만듭니다.

그러나 기본 인프라 중 일부 syntax-ppss는 상당히 일반적입니다. 주요 모드는 많은 내장 Emacs 기능과 잘 작동하고 Smartparens와 같은 다른 타사 패키지에 대한 일반 인터페이스를 제공하기 때문에 일반적으로 연결하려고 시도합니다.

특히, syntax-ppss에 의존 구문 테이블 문자열 및 의견. 구문 테이블은 구문 클래스별로 개별 문자를 분류합니다. 쌍 구분 기호, 문자열 구분 기호 및 주석 문자에 대한 클래스가 있습니다.

문자열과 주석의 구조는 거의 모든 프로그래밍 언어에서 상당히 유사합니다. 문자열은 일반적으로 특수 구분 기호로 묶습니다. 주석에는 특수 구분 기호가 있거나 특정 문자로 시작하여 줄 끝까지 확장 될 수 있습니다. 이러한 구조는 구문 테이블에서 쉽게 캡처 할 수 있으며, 거의 모든 주요 모드는 Emacs의 구문 강화로 이익을 얻는 경우에만 적절한 구문 테이블을 정의합니다.

따라서 syntax-ppss거의 모든 언어로 문자열과 주석에 적합하지만 다른 기능의 지원과 "유용성"은 다양합니다.


4

@lunaryorn의 대답에 덧붙여, syntax-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-modetrue를 반환하지 않지만 적어도 aa는 true 여야합니다.

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