“실제로 버퍼 편집”에서 emacs가 ediff-current-file을 자동으로 실행 했습니까?


11

문맥

emacs가 파일이 편집 버퍼 외부에서 변경된 것을 감지 한 경우.

관찰

이맥스는 다음과 같이 묻습니다.

디스크에서 somefilename이 변경되었습니다. 버퍼를 정말로 편집 하시겠습니까? (y, n, r 또는 Ch)

(실제로 시계가 드리프트 된 서버의 원격 파일과 같은 실제 변경 사항이없는 경우에도 종종 발생하지만 문제는 모든 경우에 흥미 롭습니다.)

소원

이맥스는 물었다 :

디스크에서 somefilename이 변경되었습니다. 버퍼를 정말로 편집 하시겠습니까? (y, n, r, d 또는 Ch)

를 누르면 d버전 간의 차이가 표시됩니다 (예 : ediff-current-file대화식으로 차이를 걸을 수 있음).

추가 정보

로컬로 커스터마이즈 된 설정 파일이 새로운 버전의 소유 패키지에 의해 업데이트되는 것을 감지 할 때 데비안 패키지 관리가하는 것과 비슷합니다. 예를 들어 , 새 버전의 구성 파일 / etc / default / grub을 사용할 수 있지만 현재 설치된 버전이 로컬로 수정되었습니다-Unix & Linux Stack Exchange를 참조하십시오.

묻기 전에 검색

나는 일반적으로 솔루션으로가는 길을 찾습니다 (예 : emacsclient-외부 스크립트에서 파일을 열고 emacs가 이미 실행 중인지 여부에 관계없이 간단한 표현을 실행합니다-Emacs Stack Exchange ).이를 검색 한 후 기존 솔루션을 찾을 수 없었습니다.

나는 이것을 스스로 조정하는 것을 고려할 것이지만 emacs-lisp 및 emacs 내부에서는 충분히 능숙하지 않습니다.

솔루션 스케치

  • C-g그런 다음 'Mx ediff-current-file`을 누르면 키 를 약간만 누르면 작업이 수행됩니다.
  • 여기서 목표 ediff-current-file는 위의 프롬프트에서 한 번의 키 누름 으로 실행 하는 것입니다.


@ 길스 감사합니다. 그렇습니다. 링크는 파일 열기 시간에 관한 것입니다. 여기는 파일 절약 시간에 관한 것입니다.
Stéphane Gourichon

답변:


2

emacs 소스에서 "실제로 버퍼 편집"에 대한 greppingask-user-about-supersession-threat 파일 에서 함수 를 찾았습니다 userlock.el.

d전화를 위한 선택 을 추가하는 것은 간단 해 보인다 ediff-current-file. 그래도 이것을 광범위하게 테스트하지 않았습니다 ( ;;-주석으로 표시된 수정 사항 ).

(defun ask-user-about-supersession-threat (fn)
  "Ask a user who is about to modify an obsolete buffer what to do.
This function has two choices: it can return, in which case the modification
of the buffer will proceed, or it can (signal 'file-supersession (file)),
in which case the proposed buffer modification will not be made.

You can rewrite this to use any criterion you like to choose which one to do.
The buffer in question is current when this function is called."
  (discard-input)
  (save-window-excursion
    (let ((prompt
       (format "%s changed on disk; \
really edit the buffer? (y, n, r, d or C-h) " ;;- changed
           (file-name-nondirectory fn)))
      (choices '(?y ?n ?r ?d ?? ?\C-h))       ;;- changed
      answer)
      (while (null answer)
    (setq answer (read-char-choice prompt choices))
    (cond ((memq answer '(?? ?\C-h))
           (ask-user-about-supersession-help)
           (setq answer nil))
          ((eq answer ?r)
           ;; Ask for confirmation if buffer modified
           (revert-buffer nil (not (buffer-modified-p)))
           (signal 'file-supersession
               (list "File reverted" fn)))
          ((eq answer ?d)                     ;;- added
           (ediff-current-file))              ;;- added
          ((eq answer ?n)
           (signal 'file-supersession
               (list "File changed on disk" fn)))))
      (message
       "File on disk now will become a backup file if you save these changes.")
      (setq buffer-backed-up nil))))

Ubuntu 16.04의 emacs 46.1에서 잘 작동하는 것 같습니다. 감사!
Stéphane Gourichon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.