Làm cách nào để tải lại một tập tin trong bộ đệm?


110

Tôi thường làm việc trên các tệp được cập nhật trong hệ thống tệp thông qua kiểm soát phiên bản. Cách nhanh chóng để tải lại tệp mà không cần phải tải lại C-x C-ftệp và được hỏi liệu tôi có muốn tải lại không?

Câu trả lời:


117

M-x revert-buffersẽ làm chính xác những gì bạn muốn. Nó vẫn sẽ yêu cầu xác nhận.

Một tùy chọn khác (yêu thích của tôi) là chức năng dưới đây:

;; 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
Bạn có thể đã trích dẫn thư viện rằng mã đó là từ : misc-cmds.el. Không phải là nó phức tạp, nhưng khi bạn sao chép một cái gì đó chính xác thì đó là phép lịch sự phổ biến để trỏ đến nguồn.
vẽ

3
Xin lỗi! Tôi, bản thân tôi, không chắc là tôi lấy đoạn trích đó từ đâu. Tôi nên đã ít nhất googled tên hàm và cố gắng tìm nguồn của nó để tôi có thể ghi có nó ở đây. Cập nhật Tôi đã ghi lại các nguồn cho tất cả mọi thứ tôi đã sao chép; chỉ không chắc chắn về điều này: github.com/kaushalmodi/.emacs.d/blob/master/setup-files/ mẹo
Kaushal Modi

4
Tôi sẽ không đề nghị chức năng này. Thật quá nguy hiểm khi sử dụng vô tình trên một tệp sửa đổi.
Gilles

2
@Gilles Tôi đồng ý, với sức mạnh lớn đi kèm với trách nhiệm lớn. Tôi sẽ không ràng buộc điều đó để dễ dàng truy cập ràng buộc.
Kaushal Modi

6
Biến thể của tôi về điều này sẽ nhắc xác nhận chỉ khi bộ đệm được sửa đổi, sử dụng (revert-buffer t (not (buffer-modified-p)) t).
glucas

55

Ngoài ra còn auto-revert-modecó nó tự động và cung cấp cho bạn thông tin phản hồi.

Từ chuỗi 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

Một tùy chọn khác, mà tôi sử dụng, find-alternate-filebị ràng buộc C-x C-v. Điều này sẽ mở một tập tin sử dụng lại bộ đệm hiện tại của bạn.

Theo mặc định, nó trỏ đến tệp bạn đang truy cập, vì vậy bạn chỉ cần nhập C-x C-v RETđể tải lại tệp của mình. Nó sẽ không nhắc trừ khi bộ đệm của bạn có dữ liệu chưa được lưu.

Một số chế độ phi văn bản như image-mode(sử dụng cho hình ảnh render, pdf, svgs ... vv) và diredđã revert-bufferbuộc phải gđể truy cập nhanh hơn.


3
Đây là tôi mới đi đến. Cảm ơn đã đề cập đến nó.
ramsey_tm

Tôi đã có một (ffap-bindings) trong .emacs của mình mà dường như thay đổi ràng buộc của C-x C-v.
ychaouche

Điều này thật tuyệt, cảm ơn! Đơn giản và hiệu quả. Btw, làm thế nào để làm cho Emacs thông báo các tập tin hiện tại thay đổi? Chẳng hạn, VIM trong chế độ GUI sẽ tự động phát hiện thay đổi tệp khi ứng dụng được lấy nét (nó được chuyển sang từ nền).
mato

Đây phải là câu trả lời được chấp nhận.
Toon Claes

10

Emacs gọi đây reverting.

Bạn có thể hoàn nguyên các tập tin hiện tại với M-x revert-buffer. Điều này nhắc nhở xác nhận xem tệp đã được sửa đổi hay chưa, ngoại trừ các tệp khớp với các mẫu được liệt kê trong biến revert-without-query(xem hướng dẫn để biết chi tiết). Một phiền toái không thường xuyên khác revert-bufferlà nó đặt lại chế độ tập tin về mặc định.

Tôi sử dụng chức năng sau đây để hoàn nguyên một loạt các tập tin, được đặt theo tên. Nếu một tệp không được mở trong một số bộ đệm, nó sẽ bị bỏ qua.

(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)))))))

Trường hợp sử dụng điển hình cho chức năng này là sau khi cập nhật tệp từ kiểm soát phiên bản. Sử dụng emacsclientđể gọi revert-filestrên tất cả các tệp đã được cập nhật hoặc (điều này dễ hơn và chỉ chậm hơn một chút) trên tất cả các tệp có liên quan đến bản cập nhật. Tôi gọi kịch bản shell sau, truyền cho nó các tệp dưới dạng đối số:

#! /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)"

Ví dụ sử dụng:

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

Những ngày này, như @webappzero nói trong câu trả lời của mình, pháp sư giải quyết phần này của vấn đề hoàn nguyên tệp một cách không đau đớn
Croad Langshan

8

bạn cũng có thể bật chế độ hoàn nguyên tự động toàn cầu như hiển thị bên dưới

(global-auto-revert-mode 1)

Điều này hữu ích khi bạn thực hiện nhiều kiểm tra các tệp js của mình với chế độ tự động sửa lỗi được bật, như trong jssc.


7

revert-bufferlanhung. Nhưng tôi muốn có một số thông tin phản hồi.

Tôi có những điều sau đây trong tôi .emacs.

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

3

Bạn có thể sử dụng find-alternate-file, được ràng buộc C-x C-vtheo mặc định và chỉ cần gõ RETvào dấu nhắc để tải lại tệp.


3

Đối với người dùng spacemacs: SPC b R( spacemacs/safe-revert-buffer).

Để bỏ qua xác nhận, các câu trả lời khác đã bao hàm điều đó, mặc dù tôi đồng ý với những người khác rằng có lẽ không nên liên kết điều đó với một khóa.


2

Magit tự động quản lý đảo ngược tệp cho bạn, do đó giải quyết vấn đề cốt lõi của bạn. Bạn cũng được hưởng lợi từ các tính năng khác của nó.

Dưới đây là các tài liệu để điều chỉnh các cài đặt bạn quan tâm:

Nếu bạn gắn bó với Magit, hãy chắc chắn bật cả 3 chế độ WIP toàn cầu (Work In Progress) để tránh mất việc.

Do đó, bạn có thể thực hiện các hành động kiểm soát phiên bản bên trong Emacs với Magit và tránh hoàn toàn vấn đề ban đầu của bạn.


1
Xin vui lòng cho tôi biết nếu điều này là hữu ích.
webappzero

Câu trả lời này nên có nhiều upvote! Trong trường hợp không rõ ràng: các chế độ WIP có thể tốt (hiện tại tôi không sử dụng chúng), nhưng chúng không thực sự cần thiết để giải quyết vấn đề hoàn nguyên cho bạn.
Croad Lang Sơn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.