괄호뿐만 아니라 키워드로 정의 된 블록을 앞뒤로 인식하도록합니다.


10

블록과 같은 키워드로 정의한 언어 (줄리아)에서 for..end, begin..end뿐만 아니라 괄호, 같은 블록을 건너 뛸 수있는 좋은 방법은 무엇입니까? 또한 end블록 키워드 일뿐만 아니라 다른 장소에서 사용되는 유효한 식별자이기도합니다.

한 가지 방법은 블록 시작 / 닫기 정규식을 찾고 모든 문자열, 주석 및 ends 등 을 건너 뛰는 것이지만 다소 비효율적이며 약간 추합니다.

emacs 자신의 구문 분석이 그러한 블록 키워드를 인식하도록하여 forward/backward-sexp자동으로 작동하고 예를 들어 syntax-ppss?

[참고 : 파일을 직접 파싱하는 것은 괜찮지 만,이 경우에도 파서를 나머지 emacs에 어떻게 연결해야하는지 알고 싶습니다.]


1
ruby-mode루비와 비슷한 것을 볼 수 있습니다 . 또 다른 옵션은 smartparens 에 연결 하는 것 입니다. 루비 모드를 위한 특별한 구성을 가지고 있습니다.
Iqbal Ansari

답변:


9

내장 라이브러리 SMIE (Simple-Minded Indentation Engine의 약자)를 살펴볼 수 있습니다 . 이름에도 불구하고 들여 쓰기는 제공하는 기능 중 하나 일뿐입니다. 이것은 ruby-modesexp 이동 및 들여 쓰기를 제공하기 위해 많은 모드 ( 의견에 언급 된 포함) 에서 사용하는 방법 입니다.

언어에 대한 SMIE 배포는 대략 2 단계 작업입니다.

  • 어휘 식별 토큰과 함께 언어에 대한 문법을 ​​정의하십시오.
  • 들여 쓰기 규칙을 정의하십시오.

귀하의 목적을 위해 첫 단계 만 필요합니다!

전체적으로 파서는이 방법으로 정의되어 emacs에 잘 연결됩니다. 예를 들어 show-parensSMIE 문법에 정의 된 Paren-like Expression을 강조 표시합니다 (최소한 최신 버전의 emacs).

syntax-ppss구문 테이블 구문 분석기의 결과 만 제공하므로 엔 클로징 환경에 대한 정보를 얻는 데 여전히 사용할 수는 없습니다 . 그러나 sexp 운동 기능 (예를 들어, up-list다음 backward-sexp)를 대체 할 수있다.


2

나는 이것을 위해 도서관 을 만들었다

일단 정의되면, 앞으로, 뒤로, 복사 등 많은 명령을 사용할 수 있습니다.

의사 코드로 정의 :

(put 'MY-FORM 'beginning-op-at
           (lambda () MY-FORWARD-MOVE-CODE))

(put 'MY-FORM 'end-op-at
     (lambda () MY-BACKWARD-MOVE-CODE))

완료되면 사용할 수 있어야합니다. 예를 들어 다음과 같이 복사하여 반환합니다.

(defun MY-FORM-atpt (&optional arg)
  " "
  (interactive "p")
  (ar-th 'MY-FORM arg))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.