버퍼에 파일을 어떻게 다시로드합니까?


110

나는 보통 버전 제어를 통해 파일 시스템에서 업데이트되는 파일을 작업합니다. 파일을 다시로드하지 않아도 C-x C-f파일을 다시로드 할 것인지 묻는 메시지가 표시 되지 않는 빠른 방법은 무엇입니까 ?

답변:


117

M-x revert-buffer당신이 원하는 것을 정확하게 할 것입니다. 여전히 확인을 요청합니다.

다른 옵션 (내가 가장 좋아하는)은 다음 기능입니다.

;; Source: http://www.emacswiki.org/emacs-en/download/misc-cmds.el
(defun revert-buffer-no-confirm ()
    "Revert buffer without confirmation."
    (interactive)
    (revert-buffer :ignore-auto :noconfirm))

8
해당 코드의 라이브러리를 인용했을 수 있습니다 misc-cmds.el. 복잡하지는 않지만 무언가를 정확하게 복사 할 때 소스를 가리키는 것이 일반적입니다.
Drew

3
사과! 나 자신은 그 발췌 문장을 어디서 얻었는지 확신하지 못했습니다. 적어도 함수 이름을 googled하고 소스를 찾으려고 노력해야합니다. 업데이트 복사 한 모든 내용의 출처를 기록했습니다. 그냥이 일에 대해 확신하지 못했습니다 : github.com/kaushalmodi/.emacs.d/blob/master/setup-files/...
Kaushal 모디

4
이 기능은 권장하지 않습니다. 수정 된 파일에 실수로 사용하는 것은 너무 위험합니다.
Gilles

2
@Gilles 나는 큰 힘으로 큰 책임을 진다고 동의한다. 나는 그것을 접근하기 쉬운 바인딩에 바인딩하지 않을 것입니다.
Kaushal Modi

6
내 변형은을 사용하여 버퍼가 수정 된 경우에만 확인 메시지를 표시합니다 (revert-buffer t (not (buffer-modified-p)) t).
glucas

55

또한이 auto-revert-mode자동으로 수행하고 당신에게 피드백을 제공한다.

doc 문자열에서 :

auto-revert-mode is an interactive autoloaded compiled Lisp function
in `autorevert.el'.

(auto-revert-mode &optional ARG)

Toggle reverting buffer when the file changes (Auto Revert mode).
With a prefix argument ARG, enable Auto Revert mode if ARG is
positive, and disable it otherwise.  If called from Lisp, enable
the mode if ARG is omitted or nil.

Auto Revert mode is a minor mode that affects only the current
buffer.  When enabled, it reverts the buffer when the file on
disk changes.

Use `global-auto-revert-mode' to automatically revert all buffers.
Use `auto-revert-tail-mode' if you know that the file will only grow
without being changed in the part that is already in the buffer.

50

내가 사용하는 다른 옵션은에 find-alternate-file바인딩되어 C-x C-v있습니다. 현재 버퍼를 재사용하는 파일이 열립니다.

기본적으로 현재 사용중인 파일을 가리 키므로 입력 C-x C-v RET하여 파일을 다시로드 할 수 있습니다. 버퍼에 저장되지 않은 데이터가 없으면 메시지가 표시되지 않습니다.

같은 일부 텍스트가 아닌 모드 image-mode및 (렌더링 사진, PDF 파일, svgs ... 등 사용)을 diredrevert-buffer바인딩 g빠른 액세스를 위해.


3
이것은 나의 새로운 갈 곳입니다. 언급 해 주셔서 감사합니다.
ramsey_tm

내 .emacs에 (ffap-bindings)이있어의 바인딩을 변경하는 것으로 보입니다 C-x C-v.
ychaouche

감사합니다! 간단하고 효과적입니다. Btw, Emacs가 현재 파일이 변경되었음을 알리는 방법? 예를 들어, GUI 모드의 VIM은 앱이 포커스를 받으면 파일 변경을 자동으로 감지합니다 (배경에서 전환됨).
mato

이것이 정답입니다.
Toon Claes

10

이맥스는 이것을 호출합니다 reverting.

을 사용하여 현재 파일을 되돌릴 수 있습니다 M-x revert-buffer. 변수에 나열된 패턴과 일치하는 파일을 제외하고 파일 수정 여부를 묻는 메시지가 표시됩니다 revert-without-query(자세한 내용은 설명서 참조). 또 다른 문제 revert-buffer는 파일 모드를 기본값으로 재설정한다는 것입니다.

다음 함수를 사용하여 이름으로 주어진 많은 파일을 되돌립니다. 파일이 일부 버퍼에서 열리지 않으면 무시됩니다.

(defun revert-files (&rest files)
  "Reload all specified files from disk.
Only files that are currently visited in some buffer are reverted.
Do not ask confirmation unless the buffer is modified."
  (save-excursion
    (let ((revert-without-query '("")))
      (dolist (file-name files)
        (message "Considering whether to revert file %s" file-name)
        (let ((buf (find-buffer-visiting file-name)))
          (when buf
            (message "Reverting file in buffer %s" (buffer-name buf))
            (set-buffer buf)
        (revert-buffer t nil t)))))))

이 기능의 일반적인 사용 사례는 버전 관리에서 파일을 업데이트 한 후입니다. 업데이트 된 모든 파일 emacsclient을 호출 revert-files하거나 업데이트와 관련된 모든 파일 을 호출 하는 데 사용 합니다 . 다음 쉘 스크립트를 호출하여 파일을 인수로 전달합니다.

#! /bin/sh
# Similar to gnuclient, but call `revert-files' on the files.
files=

## Find a way to convert a path to absolute. Bizarre OSes such as Windows
## require special cases. We also try to detect non-filenames such as URIs.
case `uname -s` in
  CYGWIN*)
    absolute_path () {
      cygpath -a -w -- "$1"
    };;
  *)
    wd="`pwd -P 2>/dev/null || pwd`"
    absolute_path () {
      case "$1" in
        /*) printf '%s' "$1";; # ordinary absolute path
        *:/*)
          if expr "z$1" : 'z[0-9A-Z_a-z][-.0-9@A-Z_a-z]*:/.*'; then
            printf '%s' "$1" # URI or machine:/some/path
          else
            printf '%s' "$wd/$1" # default to a relative path
          fi;;
        *) printf '%s' "$wd/$1";; # default to a relative path
      esac
    };;
esac

for x; do
  files="$files \"`absolute_path "$x" | sed 's/[\\\\\\\"]/\\\\&/g'`\""
done
exec emacsclient -e "(revert-files$files)"

사용 예 :

svn update
find -name .svn -prune -o -type f -exec emacsclient-revert {} +

요즘 @webappzero의 답변에서 magit은 파일 복구 문제 의이 부분을 고통없이 해결합니다.
Croad Langshan

8

아래와 같이 전역 자동 복귀 모드를 활성화 할 수도 있습니다

(global-auto-revert-mode 1)

이것은 jssc와 같이 자동 수정 모드가 활성화 된 js 파일을 많이 검사 할 때 유용합니다.


7

revert-buffer있습니다. 하지만 피드백을 받고 싶습니다.

내에 다음이 .emacs있습니다.

(global-set-key (kbd "C-c r") (lambda ()
                                (interactive)
                                (revert-buffer t t t)
                                (message "buffer is reverted")))

3

기본적으로 find-alternate-file바인딩 된을 사용할 수 있으며 프롬프트에서 C-x C-v간단히 입력 RET하면 파일을 다시로드 할 수 있습니다.


3

스페이스 맥 사용자의 경우 : SPC b R( spacemacs/safe-revert-buffer).

확인을 건너 뛰기 위해 다른 답변은 이미 다룹니다.하지만 다른 사람에게는 동의하지만 키에 바인딩하는 것은 좋지 않습니다.


2

Magit은 자동으로 파일 복구를 관리하여 핵심 문제를 해결합니다. 다른 기능들도 활용할 수 있습니다.

관심있는 설정을 조정하기위한 문서 는 다음과 같습니다 .

Magit을 사용하는 경우 작업 손실을 피하기 위해 3 개의 전역 WIP 모드 (Work In Progress)를 모두 활성화 해야합니다 .

따라서 Magit을 사용하여 Emacs 내에서 버전 제어 작업을 수행하고 원래 문제를 방지 할 수 있습니다.


1
도움이되는지 알려주십시오.
webappzero

이 답변에는 더 많은 투표가 있어야합니다! 명확하지 않은 경우 : WIP 모드가 좋을 수도 있지만 (현재 사용하지는 않음) 되돌리기 문제를 해결하기 위해 반드시 필요한 것은 아닙니다.
Croad Langshan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.