일치하는 쌍 내부를 감지하는 방법?


16

Q : 포인트가 일치하는 문자 쌍 내에 있는지 여부를 감지하는 일반적인 방법이 있습니까?

즉, 포인트가 일치하는 쌍 또는 임의로 선택된 문자 사이에 있는지 여부를 판별 할 수있는 일반 술어 함수 (또는 무언가)가 있습니까? t예를 들어 다음 시나리오에서 평가할 사항에 대해 생각하고 있습니다 !.

"!"   (quotes in general)
``!'' (LaTeX quotes)
$!$   (LaTeX math)
(!)   (lisp parens)
*!*   (org emphasis)

편집 : syntax-ppss좋은 출발점 인 것처럼 보이지만 다중 문자 일치 쌍 (예 :``LaTeX quotes ''또는 matched <b>html tags</b>)에 어떻게 적용할지는 명확하지 않습니다 . 일반적인 솔루션이 있는지 또는 특수 목적 파서가 필요한지 궁금합니다.

답변:


16

syntax-ppss여기 도움이 될 수 있습니다. 이 목록 반환 이러한 요소가 있습니다 :

  • 요소 0 : 파 렌스 깊이
  • 요소 3 : 문자열 내부의 경우 비 NULL

다음과 같이 사용할 수 있습니다.

(or (> (nth 0 (syntax-ppss)) 0)
    (nth 3 (syntax-ppss)))

버퍼에 구문 테이블을 올바르게 설정하면 (문자열 및 일치하는 Parens의 경우) 함수가 예상 한대로 수행해야합니다. 모드의 syntax-table을 사용할 수없는 경우을 사용하여 의지 할 수 with-syntax-table있습니다.


의 docstring은 내가 링크 한 Elisp 매뉴얼 섹션보다 더 자세히 parse-partial-sexp반환 된 데이터 구조 를 설명 한다는 것을 지적해야 syntax-ppss합니다.
파프리카

2

예를 들어 중괄호 사이를 확인하려면 다음을 사용하십시오.

(and (looking-back "{") (looking-at "}"))

물론, 원하는대로 중괄호를 바꿀 수 있습니다.

편집하다:

더 유용한 기능은 다음과 비슷합니다.

(defun test-inside-curly-braces ()
 (interactive)
 (when (and (looking-back "{\\(.*?\\)") (looking-at "\\(.*?\\)}"))
  (message "inside curly braces")))

2
point가 닫혀있는 경우에만 작동하며 }사이에 아무것도 없습니다 {}. 정규 표현식과 쌍을 이루는 구분 기호를 얻는 것은 까다로울 수 있습니다. syntax-pps@paprika가 제안한대로 사용 하는 것이 좋습니다.
Tyler

@Tyler는 닫는 시점 }이 내가 본 행동이 아닌 경우에만 작동 하지만, 그래,
정규 표현식을

looking-at시점에서 시작하는 텍스트를 검사합니다. }위의 첫 번째 진술 에 포인트가 없으면 작동하지 않아야합니까? 이맥스 버전의 차이 일 수 있습니다. : /
Tyler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.