2014-02-21 1 views
5

현재 다른 위치로 이동하고 함수를 실행 한 다음 해당 위치로 돌아가는 elisp 함수를 작성 중입니다. 내 유일한 문제는 함수가 텍스트를 삽입하면 내가 저장 한 위치가 더 이상 원하는 위치에 없다는 것입니다.Elisp : 위치 저장, 앞에 텍스트 삽입, 같은 위치로 돌아 가기

Hello World 

그리고이 전 위치 (6)에서 'W'에있어 가정 해 봅시다 그리고 이제 나는 또 다른 "안녕하세요"이 같은 시작 부분에 삽입 할 가정 해 봅시다 : 예를 들어, 나는 다음과 같은 문자열이 있다고

Hello Hello World 

내가 지금하고있는 방식대로 변수에 6을 저장하고, 안녕하세요를 삽입 한 다음 위치 6으로 돌아갑니다. 그러나 이제 두 번째여보세요가 위치 6에 있으며 나는 6 단계로 돌아갑니다. 잘못된 장소! 최종 후크에이 일을하는 것은 정말 아닌, 불행하게도

(do-stuff) 
(goto-char my-retloc) 

: 이동 기능의 최종 후크에 다음

(setq my-retloc (point)) 
(move-function) 

:

는 지금은 이런 일을하고 있어요 피할 수있는. elisp에서 정확한 위치로 돌아갈 수있는 방법이 있습니까?

답변

6

이것은 elisp에서 매우 일반적으로 필요한 항목이므로 자동으로 수행하는 특별한 형식이 있습니다 : save-excursion. 이처럼 사용

(save-excursion 
    ;; move about and modify the buffer 
    (do-stuff)) 
;; position restored 
+0

답변 해 주셔서 감사합니다. 그러나, 다른 기능으로 복귀해야하기 때문에 이것은 내 문제를 해결하지 못합니다. 커서를 이동하려면 에이스 점프를 사용하려고하지만 어떤 이유로 순서대로 실행을 거부합니다. 결과적으로, 나는 하나의 기능으로 나의 위치를 ​​저장하고 다른 기능 (에이스 점프의 끝단 고리)에서 나의 위치를 ​​복원해야한다. 나는 왜 그런지 잘 모르지만 에이스 점프는 세이브 여행에서 좋은 플레이를하지 못합니다. – user1539179

1

당신이 save-excursion을 사용할 수없는 경우, @ataylor가 제안하고 다음과 같은 일을 할. (반환은 원래의 함수 호출 함수 내에서가 아닌 경우 아마도 당신은 어느 unwind-protect을 사용할 수 없습니다.)

  1. 저장 point을 전역 변수에. point을 마커로 저장하십시오. 현재 버퍼가 변경되거나 버퍼 텍스트가 수정되면 저장된 정수 위치가 쓸모 없게됩니다.

  2. point을 저장하는 코드는 catch으로 감싸고 모든 경우에 원래 위치로 복원하십시오 (예 : unwind-protect).

  3. 여행을 마치면 throw을 사용하여 복원 코드 (마커로 이동)로 돌아갑니다.

+0

마크가 완벽하게 작동했습니다. 정말 고맙습니다! – user1539179

+0

안녕하세요 @ user1539179, 답변으로 문제가 해결되면 답변으로 표시하는 것이 좋습니다. –

+0

@Drew 어떻게'point'를 마커로 저장합니까? 'mark','set-mark','push-mark'? –

관련 문제