2010-02-17 4 views

답변

16

이맥스는 정말로 당신을 여기에서 도우려고합니다. Protection against Simultaneous Editing의 정보 페이지를 읽어보십시오.

, 당신은 여전히 ​​메시지/프롬프트, 당신이하고있는 기능을 재정의 할 수 피하고 싶은 경우 프롬프트 :

(defun ask-user-about-supersession-threat (fn) 
    "blatantly ignore files that changed on disk" 
) 
(defun ask-user-about-lock (file opponent) 
    "always grab lock" 
    t) 

두 사람이 편집 할 이맥스를 사용하는 경우에 대한이 두 번째 함수 동일한 파일을 사용하고 비슷한 프롬프트를 제공합니다 (그러나 질문에서 언급 한 것처럼 보이지는 않습니다).

두 가지 루틴을 재정의하지 말 것을 권하고 싶지만, 원한다면 거기에 있습니다.


off off global-auto-revert-mode이 켜져 있으면 비활성화 할 수 있습니다. 이 당신의 이맥스에 추가

이 가
(global-auto-revert-mode -1) 
이 모드는 같은 이름의 변수를 보면 켜져 있으면 당신은 말할 수

: 값이 t입니다

C-h v global-auto-revert-mode RET 

경우 모드가 켜져 그렇지 않으면 꺼져 있습니다.

+4

/mnt 아래/hgfs에서 VM웨어에서 이맥스와 editting에 파일을 실행할 때이 많이 온다 (링크 머신 폴더를 호스팅하는 경우). VMWare의 시계가 호스트와 동기화되지 않는 경우가 종종 있습니다. 시스템 호출이 시간의 거꾸로 뛰어 오르는 시간을 볼 수도 있습니다. 그래서 ... 특정 디렉토리의 파일을 편집 할 때만 검사를 비활성화 할 수 있습니까? (예 :/mnt/hgfs?) – user48956

+1

이 해결 방법은 Parallels on OSX를 통해 Windows에서 Emacs를 사용하여 기본/호스트 OSX에서 파일을 수정할 때도 필요합니다. 'ask-user-about-suppression-threat'를 수정하는 것 외에도'defalias'와 생략/제거하는 새로운 함수로'basic-save-buffer'를 수정했습니다 :'(또는 (verify-visited-file- yes 또는 no-p (형식 "% s은 (는) 방문한 후 저장되었거나 저장되었습니다. 어쨌든 저장 하시겠습니까?"(file-name은 (현재 버퍼)) (파일 존재하지 않는 버퍼 파일 이름) -nondirectory buffer-file-name))) (사용자 오류 "확인되지 않음"))'. – lawlist

+0

Emacs는 정말로 타임 스탬프뿐 아니라 파일의 내용이 변경되었는지 확인해야합니다. 이것은 내가 git 브랜치를 일시적으로 바꿀 때마다 내 모든 버퍼에서 발생한다. (또는 git stash save/pop). * 편집 * 방금 @doublep의 대답을 발견했습니다 – EoghanM

9

git에서 분기를 바꿀 때마다 이맥스는 내 모든 파일이 변경된 것으로 생각하여이 점 때문에 성가심이있었습니다.

Revbuffs이 증상을 극복하는 데 도움이됩니다. 모든 버퍼를 다시로드 할 수 있습니다.

(global-auto-revert-mode)을 시도해도 자동으로 파일을 디스크에있는 파일로 되돌릴 수 있습니다.

8

.emacs에 다음과 같은 내용이 있습니다. Emacs는 정말로 변경된 파일에 대해서만 묻습니다. 만약 파일이 똑같이 남아 있다면 VCS의 브랜치를 바꿀 때 자주 발생하는 것처럼 타임 스탬프 만 업데이트됩니다.이 "변경"은 이맥스에서 무시됩니다. 내 경우

;; Ignore modification-time-only changes in files, i.e. ones that 
;; don't really change the contents. This happens often with 
;; switching between different VC buffers. 

(defun update-buffer-modtime-if-byte-identical() 
    (let* ((size  (buffer-size)) 
     (byte-size (position-bytes size)) 
     (filename buffer-file-name)) 
    (when (and byte-size (<= size 1000000)) 
     (let* ((attributes (file-attributes filename)) 
      (file-size (nth 7 attributes))) 
     (when (and file-size 
        (= file-size byte-size) 
        (string= (buffer-substring-no-properties 1 (1+ size)) 
          (with-temp-buffer 
           (insert-file-contents filename) 
           (buffer-string)))) 
      (set-visited-file-modtime (nth 5 attributes)) 
      t))))) 

(defun verify-visited-file-modtime--ignore-byte-identical (original &optional buffer) 
    (or (funcall original buffer) 
     (with-current-buffer buffer 
     (update-buffer-modtime-if-byte-identical)))) 
(advice-add 'verify-visited-file-modtime :around #'verify-visited-file-modtime--ignore-byte-identical) 

(defun ask-user-about-supersession-threat--ignore-byte-identical (original &rest arguments) 
    (unless (update-buffer-modtime-if-byte-identical) 
    (apply original arguments))) 
(advice-add 'ask-user-about-supersession-threat :around #'ask-user-about-supersession-threat--ignore-byte-identical) 
+0

+1 이것은 내가 생각했던 것과 매우 유사하지만 버퍼에 저장되지 않은 변경 사항이없는 경우에만 올바르게 작동합니다. 나는 버퍼 SHA1s (또는 MD5 또는 빠른 속도로 계산할 수있을만큼 충분히 싸고 충돌에 대해 충분히 견고한)의 assoc 배열을 유지하고 새로운 파일을 방문 할 때마다 또는 파일을 저장할 때마다 업데이트한다는 생각을했습니다. 그런 다음 업데이트 된 타임 스탬프가있는 파일이 동일한 해시를 갖고 있으면 경고가 필요하지 않습니다. – tripleee

+0

예, 설명한대로 처리되지 않은 사례가 있습니다. 그러나 나는 버퍼를 자주 절약하는 습관이 있기 때문에 충분하다. – doublep

+0

@doublep 당신은 내 영웅입니다! – EoghanM

3

내가 원 :

(setq revert-without-query '(".*")) 

문서 revert-without-query을 위해 :

Specify which files should be reverted without query. 
The value is a list of regular expressions. 
If the file name matches one of these regular expressions, 
then ‘revert-buffer’ reverts the file without querying 
if the file has changed on disk and you have not edited the buffer. 
관련 문제