2013-10-14 5 views
2

Emacs 버퍼 내부의 현재 위치에서부터, 그 점을 포함하는 가장 바깥 쪽의리스트/s-expression은 어떻게 얻을 수 있습니까?현재 점에서 가장 바깥 쪽 목록 가져 오기

예 1 :

(defun xpto(arg) 
    (+ 2 4)[point]) 

출력 1 :

(defun xpto(arg) 
     (+ 2 4)) 

예 2 :

(defun [point]xpto(arg) 
    (+ 2 4)) 


내가 달성하고자하는 것을 설명하기 위해 몇 가지 예를 따릅니다 출력 2 :

(defun xpto(arg) 
     (+ 2 4)) 

예 3

(defun xpto(arg) 
    (+ 2 4))[point] 

출력 3 :

NIL 

는 전술 한 동작을 수행 이맥스 의해 제공된 "기성품"기능이 있는가?
그렇지 않은 경우 쉽게 달성하기 위해 더 쉽게 접근 할 수 있습니까? 내가 아무리 지점에있다 어디에 출력을 얻을 + P Ctrl 키를 누른 후, 그러나

;; Gets the outermost brackets based on point position 
(defun get-outermost-brackets() 
    (interactive) 
    (car (last (nth 9 (syntax-ppss))))) 


;; Assigns that function to a key 
(global-set-key [(control p)] 'get-outermost-brackets) 

:

업데이트 # 1

으로는 나는 다음과 같은 방법을 시도 제안했다.
내가 뭘 잘못하고 있니?

답변

4

당신이 찾고있는 것은 parse-partial-sexp입니다. 이것은 parser state (10 요소 목록!)을 반환합니다.이 부분을 사용하여 성별의 시작과 끝 위치를 파악할 수 있습니다.

개미 유용 기능은 scan-sexps입니다.

업데이트 # 1 : 바깥 쪽 열린 괄호, 당신의 버퍼없는 유용한 부분의 위치를 ​​반환하고, 그 값 어쨌든 응답 영역에 표시하지 않을 get-outermost-brackets

함수.

업데이트 # 2 :

이것은 응답 영역을 둘러싸는 sexp과 *Messages* 버퍼를 보내드립니다 :

(defun get-enclosing-sexp (&optional pos) 
    (interactive) 
    (message "%s" (save-excursion 
        (goto-char (car (last (nth 9 (syntax-ppss))))) 
        (read (current-buffer))))) 

드롭 message 당신이 함수의 sexp을 반환 할 대신에 단지 보여주는 경우 그것.

백만 달러는 어디입니까?

+0

그 위치가 미니 버퍼 또는 * messages * 버퍼에 정수로 인쇄 될 것으로 예상했습니다. 그래서 1 백만 달러에 대한 질문 : s- 표현식은 get-awest- brackets에 의해 반환 된 위치에서 어떻게 시작할 수 있습니까? – utxeee

4

(car (last (nth 9 (syntax-ppss))))은 가장 바깥쪽에있는 괄호 (또는 괄호 안에 있지 않으면 nil)의 위치를 ​​알려줍니다. 해당 표현식을 s-exp로 가져 오려면 해당 위치로 이동 한 다음 read을 사용하십시오.

+0

작동하지 않거나 뭔가 빠졌습니까? – utxeee

+0

실제로 "작동하지 않았습니다"라는 것이 누락되었습니다. – Stefan

+0

원래 게시물에서 내 업데이트를 보았습니까? – utxeee