Tampondaki bir dosyayı nasıl yeniden yüklerim?


110

Genellikle dosya sisteminde güncellenen dosyalar üzerinde sürüm kontrolü ile çalışıyorum. Bir C-x C-fdosyayı tekrar kullanmak zorunda kalmadan yeniden yüklemek ve yeniden yüklemek isteyip istemediğim sorulmasının hızlı bir yolu nedir ?

Yanıtlar:


117

M-x revert-buffertam olarak ne istersen onu yapacağım. Yine de onay isteyecektir.

Başka bir seçenek (favorim) aşağıdaki işlevdir:

;; 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
O kod dan kütüphane atıf olabilir: misc-cmds.el. Bu karmaşık değil, ancak bir şeyi tam olarak kopyaladığınızda , kaynağa işaret etmek ortak bir nezakettir.
Drew

3
Özür dilemek! Ben kendim o parçacığı nereden aldığımdan emin değildim. En azından fonksiyon ismini googledim ve kaynağını bulmaya çalışmalıyım ki burada kredilendirmeliyim. Güncelle Kopyaladığım her şeyin kaynaklarını not aldım; sadece bundan emin değildim
Kaushal Modi

4
Bu işlevi tavsiye etmem. Yanlışlıkla değiştirilmiş bir dosyada kullanmak çok tehlikelidir.
Gilles

2
@ Gilles katılıyorum, büyük güçle büyük sorumluluk geliyor. Bunu, kolay erişilebilir bir ciltlemeye bağlamazdım.
Kaushal Modi

6
Bunun bir türevi, sadece tampon kullanılarak değiştirildiyse, onay istenecektir (revert-buffer t (not (buffer-modified-p)) t).
glucas,

55

Ayrıca auto-revert-modeotomatik olarak yapan ve size geri bildirim veren de var.

Doc dizesinden:

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

Kullandığım başka bir seçenek de buna find-alternate-filebağlı C-x C-v. Bu, mevcut tamponunuzu yeniden kullanan bir dosya açar.

Varsayılan olarak, o anda bulunduğunuz dosyayı gösterir; böylece C-x C-v RETdosyanızı yeniden yüklemek için yazabilirsiniz . Tamponunuzda kaydedilmemiş veriler olmadıkça sorulmaz.

Bazı metin dışı modlar image-mode(resim, pdfs, svgs, vb. Oluşturmak için kullanılır) ve daha hızlı erişim için diredbuna revert-bufferbağlı g.


3
Bu benim yeni gidiyorum. Bahsettiğin için teşekkürler.
ramsey_tm 10:16

.Emac'larımda bağını değiştiriyor gibi görünen bir ffap ciltleri vardı C-x C-v.
34'te

Bu harika, teşekkürler! Basit ve etkili. BTW, Emacs'ın mevcut dosyanın değiştiğini fark etmesini nasıl sağlarım? Örneğin, GUI modundaki VIM, uygulama odaklandığında otomatik olarak bir dosya değişikliği algılar (arka plana geçiş yapılır).
mato

Bu kabul edilen cevap olmalı.
Toon Claes

10

Emacs bunu çağırıyor reverting.

Geçerli dosyayı ile geri alabilirsiniz M-x revert-buffer. Bu, değişkende listelenen desenlerle eşleşen dosyalar haricinde, dosyanın değiştirilip değiştirilmediğini onaylamanızı ister revert-without-query(ayrıntılar için kılavuza bakınız). Bir başka zaman zaman rahatsızlığı da revert-buffer, dosya modunu varsayılan ayarlara getirmesidir.

Aşağıdaki işlevi, ada göre verilen bir sürü dosyayı geri almak için kullanıyorum. Bir dosya bir arabellekte açılmazsa, dikkate alınmaz.

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

Bu fonksiyon için tipik bir kullanım örneği, dosyaları sürüm kontrolünden güncelledikten sonra. Güncelleştirilen tüm dosyalarda emacsclientarama yapmak revert-filesiçin kullanın veya güncellemeyle ilgili tüm dosyalarda (bu daha kolay ve sadece biraz daha yavaş). Dosyaları şu argüman olarak ileterek aşağıdaki kabuk betiğini çağırıyorum:

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

Kullanım örneği:

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

Bu günlerde, @webappzero'nun cevabında dediği gibi, magit dosya döndürme probleminin bu bölümünü acısız bir şekilde
çözüyor

8

ayrıca genel-otomatik geri döndürme modunu aşağıda gösterildiği gibi etkinleştirebilirsiniz.

(global-auto-revert-mode 1)

Bu, jssc'nizde olduğu gibi otomatik düzeltme kipinin etkin olduğu js dosyalarınızı çokça kontrol ettiğinizde yararlıdır.


7

revert-buffervar mı. Ama biraz geri bildirim almak istiyorum.

İçimde aşağıdakiler var .emacs.

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

3

Varsayılan find-alternate-fileolarak bağlı olan kullanabilirsiniz ve dosyayı yeniden yüklemek için C-x C-vsadece RETkomut istemine basmanız yeterlidir .


3

Boşluk kullanıcıları için: SPC b R( spacemacs/safe-revert-buffer).

Onayı atlamak için, diğer cevaplar zaten bunu kapsıyor, ancak diğerleri ile bir anahtara bağlamanın muhtemelen iyi bir fikir olmadığı konusunda hemfikirim.


2

Magit sizin için dosya revizyonlarını otomatik olarak yöneterek temel probleminizi çözer. Ayrıca diğer özelliklerinden de faydalanırsınız.

İşte dokümanlar verdiği için ilgilendiğiniz ayarları:

Magit'e bağlı kalırsanız, iş kaybını önlemek için 3 global WIP modunun da (Work In Progress) etkinleştirildiğinden emin olun .

Böylece, Magac ile Emacs içindeki sürüm kontrolü işlemlerini gerçekleştirebilir ve orijinal probleminizi tamamen önleyebilirsiniz.


1
Lütfen yardımcı olup olmadığını bana bildirin.
webappzero

Bu cevabın daha fazla oyu olmalı! Durum açık değilse: WIP modları iyi olabilir (şu anda kullanmıyorum), ancak sizin için geri dönüş problemini çözmesi için kesinlikle gerekli değillerdir.
Croad Langshan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.