2010-06-19 5 views
4

아주 이상한 행동을했을 때 another SO question으로 대답하려고했습니다.Emacs에서 프리미티브를 조언하는 방법

(make-variable-buffer-local 
(defvar my-override-mode-on-save nil 
    "Can be set to automatically ignore read-only mode of a file when saving.")) 

(defadvice file-writable-p (around my-overide-file-writeable-p act) 
    "override file-writable-p if `my-override-mode-on-save' is set." 
    (or 
    my-override-mode-on-save 
    ad-do-it)) 

(defun my-override-toggle-read-only() 
    "Toggle buffer's read-only status, keeping `my-override-mode-on-save' in sync." 
    (interactive) 
    (setq my-override-mode-on-save (not my-override-mode-on-save)) 
    (toggle-read-only)) 

(defun tester-fn() 
    (interactive) 
    (let ((xxx (file-writable-p "/tmp/foofoo")) 
     (yyy (file-writable-p "/tmp/fooxxfoo"))) 
    (message (concat "XXX: " (if xxx "yes" "no") " - YYY: " (if yyy "yes" "no"))))) 

: 여기에 내 작은 테스트 케이스입니다.

  • /tmp/foofoo 난에 my-override-toggle-read-only을 방문하고 실행 한 읽기 전용 파일입니다
  • /tmp/fooxxfoo
  • 가 존재하지 않습니다.
  • /tmp은 (는) 로그인 한 사용자가 글을 쓸 수 있습니다.

내가 my-override-mode-on-savet로 설정되는 버퍼에 tester-fn를 실행하면는 내가 예상치 못한 결과를 얻을 : XXX: no - YYY: no. 다른 버퍼 (예 : 스크래치)에서 tester-fn을 실행하면 미니 버퍼에 예상되는 응답이 표시됩니다. XXX: no - YYY: yes. 디버거를 통해 조언을 추적하면 예상 한 부분을 건너 뛰고 예상되는 부분을 건너 뛰고 기대하는 부분을 건너 뛰고 기대하는 부분을 실행하여 올바르게 수행해야한다고 생각하는 것입니다. 그러나 디버거를 통해 tester-fn을 추적하면 매우 다른 값이 반환됩니다 (변수가 nil로 평가되면 nil & t, 변수가 nil이 아닌 것으로 평가하면 nil & nil이 반환 됨). nil & nil 반환은 정말 내가 기괴한 찾으십시오.

나는 여기서 무슨 일이 일어나는지 전혀 모른다. 왜 내가 예상 한 결과를 얻지 못하는지 누구나 아는가?

답변

4

코드가 누락 된 경우를 제외하고 코드가 잘 보입니다. 당신은 적절하게 반환 값을 설정해야합니다

(defadvice file-writable-p (around my-overide-file-writeable-p act) 
    "override file-writable-p if `my-override-mode-on-save' is set." 
    (setq ad-return-value 
     (or 
     my-override-mode-on-save 
     ad-do-it))) 

이것은 advice manual에 설명되어 있습니다.

+0

필자는 항상 '광고 반환 값'이 반환 값을 무시하는 데 사용되었다고 생각했지만 설정하지는 않았습니다. 그러나 이것은 실종 된 조각이었습니다 - 감사합니다! –

+0

@JoeCasadonte 나는 그 문장을 같은 것으로 읽은 것 같아 ... –

+0

차이점은 (나를 위해) 반환 값이 정상 (즉, 마지막 평가 된 표현식)이고'ad-return-value'가 사용된다는 가정이다 그것을 바꾸는 것. –

관련 문제