ฉันจะโหลดไฟล์ในบัฟเฟอร์ได้อย่างไร


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คุณอาจได้อ้างถึงห้องสมุดที่รหัสที่เป็นจาก: ไม่ว่ามันมีความซับซ้อน แต่เมื่อคุณคัดลอกบางสิ่งบางอย่างว่ามันเป็นมารยาททั่วไปจะชี้ไปที่แหล่งที่มา
ดึง

3
ขอโทษ! ฉันเองไม่แน่ใจว่าฉันได้รับข้อมูลจากที่ใด ฉันควรมีชื่อฟังก์ชันอย่างน้อย googled และพยายามค้นหาแหล่งที่มาของมันเพื่อที่ฉันจะได้เครดิตที่นี่ อัปเดตฉันได้จดบันทึกแหล่งที่มาสำหรับทุกสิ่งที่ฉันคัดลอก ไม่แน่ใจเกี่ยวกับสิ่งนี้: github.com/kaushalmodi/.emacs.d/blob/master/setup-files/…
Kaushal Modi

4
ฉันจะไม่แนะนำฟังก์ชั่นนี้ มันอันตรายเกินไปที่จะใช้งานไฟล์ที่ถูกดัดแปลงโดยไม่ตั้งใจ
Gilles

2
@Gilles ฉันเห็นด้วยพลังอันยิ่งใหญ่มาพร้อมความรับผิดชอบที่ดี ฉันจะไม่ผูกมัดกับการเข้าถึงที่ง่าย
Kaushal Modi

6
ตัวแปรของฉันนี้จะแจ้งการยืนยัน (revert-buffer t (not (buffer-modified-p)) t)แต่ถ้าบัฟเฟอร์มีการแก้ไขโดยใช้
ลูกัส

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 ... ฯลฯ ) และdiredมีการrevert-bufferเชื่อมต่อเพื่อgให้เข้าถึงได้เร็วขึ้น


3
นี่คือการไปใหม่ของฉัน ขอบคุณที่พูดถึงมัน
ramsey_tm

ผมมี (ffap-ผูก) ใน .emacs C-x C-vของฉันซึ่งดูเหมือนว่าจะเปลี่ยนผูกพันของ
ychaouche

ขอบคุณมาก! ง่ายและมีประสิทธิภาพ Btw, วิธีทำให้ Emacs สังเกตว่าไฟล์ปัจจุบันเปลี่ยนไป? ตัวอย่างเช่น VIM ในโหมด GUI ตรวจจับการเปลี่ยนแปลงไฟล์โดยอัตโนมัติเมื่อแอปได้รับโฟกัส (มันถูกเปลี่ยนเป็นจากพื้นหลัง)
mato

นี่ควรเป็นคำตอบที่ยอมรับได้
Toon Claes

10

Emacs เรียกสิ่งนี้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ไฟล์ทั้งหมดที่อัปเดตหรือ (นี้ง่ายกว่าและช้ากว่าเล็กน้อย) สำหรับไฟล์ทั้งหมดที่เกี่ยวข้องกับการอัปเดต ฉันเรียก shell script ต่อไปนี้โดยส่งผ่านไฟล์เป็นอาร์กิวเมนต์:

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

สิ่งนี้มีประโยชน์เมื่อคุณทำการตรวจสอบไฟล์ js ของคุณเป็นจำนวนมากโดยเปิดใช้งานโหมดแก้ไขอัตโนมัติเช่นใน jssc


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

สำหรับผู้ใช้ spacemacs: SPC b R( spacemacs/safe-revert-buffer)

สำหรับการข้ามการยืนยันคำตอบอื่น ๆ ครอบคลุมอยู่แล้วแม้ว่าฉันจะเห็นด้วยกับคนอื่นว่ามันอาจไม่ควรผูกมันไว้กับกุญแจ


2

Magit จัดการการกลับรายการไฟล์ให้คุณโดยอัตโนมัติดังนั้นการแก้ปัญหาหลักของคุณ คุณยังได้รับประโยชน์จากคุณสมบัติอื่น ๆ

นี่คือเอกสารสำหรับปรับแต่งการตั้งค่าที่คุณสนใจ:

หากคุณใช้ Magit อย่าลืมเปิดใช้งานโหมด WIP ทั่วโลกทั้ง 3 โหมด (อยู่ระหว่างดำเนินการ) เพื่อหลีกเลี่ยงการสูญเสียงาน

คุณสามารถทำการควบคุมเวอร์ชันภายใน Emacs ด้วย Magit และหลีกเลี่ยงปัญหาดั้งเดิมของคุณได้ทั้งหมด


1
โปรดแจ้งให้เราทราบหากสิ่งนี้มีประโยชน์
webappzero

คำตอบนี้ควรมีผู้โหวตมากขึ้น! ในกรณีที่ไม่ชัดเจน: โหมด WIP อาจใช้งานได้ดี (ฉันไม่ได้ใช้ในขณะนี้) แต่ก็ไม่จำเป็นอย่างยิ่งที่จะต้องแก้ไขปัญหาการคืนค่าให้กับคุณ
Croad Langshan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.