2010-02-17 5 views

Antwort

16

Emacs versucht wirklich, Ihnen hier zu helfen. Lesen Sie die Infoseite unter Protection against Simultaneous Editing.

Aber, wenn Sie wollen immer noch, dass Nachricht/prompt zu vermeiden, können Sie die Funktion neu zu definieren, die die Aufforderung tut:

(defun ask-user-about-supersession-threat (fn) 
    "blatantly ignore files that changed on disk" 
) 
(defun ask-user-about-lock (file opponent) 
    "always grab lock" 
    t) 

Die zweite Funktion dort ist, wenn zwei Menschen Emacs verwenden die bearbeiten gleiche Datei und würde eine ähnliche Eingabeaufforderung bereitstellen (aber nicht die, auf die Sie in der Frage verwiesen zu haben scheinen).

Ich rate davon ab, die beiden Routinen zu überschreiben, aber es ist da, wenn Sie wollen.


Auf die aussichtslose global-auto-revert-mode ist, können Sie das deaktivieren. Fügen Sie diese auf Ihre .emacs:

(global-auto-revert-mode -1) 

Sie sagen kann, ob der Modus, indem man die Variable mit dem gleichen Namen auf ist:

C-h v global-auto-revert-mode RET 

Wenn der Wert t ist, dann ist der Modus auf sonst ist es aus.

+4

Das kommt eine Menge, wenn Emacs in VMWare und editting Dateien in/mnt/hgfs (links laufen Maschinenordner zu hosten). Die Uhr von VMWare ist nicht mehr mit dem Host synchronisiert - gelegentlich können Sie sogar das Ergebnis der Zeit sehen, die Systemaufrufe zeitlich rückwärts springen. Also, ... ist es möglich, die Prüfung nur zu deaktivieren, wenn Dateien in einem bestimmten Verzeichnis bearbeitet werden? (z. B./mnt/hgfs?) – user48956

+1

Diese Problemumgehung wird auch benötigt, wenn Emacs unter Windows über Parallels unter OSX verwendet wird, um Dateien auf dem nativen/Host-OSX zu ändern. Zusätzlich zum Ändern von 'ask-user-about-suppression-threat' habe ich auch' basic-save-buffer' mit 'defalias' und einer neuen Funktion modifiziert, die folgendes weglässt/entfernt:' (oder (verify-visited-file- modtime (current-buffer)) (nicht (file-exists-p buffer-file-name)) (ja-oder-nein-p (Format "% s hat sich seit dem Besuch geändert oder gespeichert. Trotzdem speichern?" (Dateiname -nondirectory buffer-file-name))) (user-error "Speichern nicht bestätigt")) '. – lawlist

+0

Emacs sollte wirklich überprüfen, dass sich der Inhalt der Datei geändert hat und nicht nur die Zeitstempel. Dies passiert jedes Mal, wenn ich vorübergehend die git branches umschalte und zurück wechsle (oder git stash save/pop). * Edit * habe gerade @doubleps Antwort entdeckt – EoghanM

9

Ich hatte Ärger damit, weil jedes Mal, wenn ich Filialen in Git wechselte, dachte Emacs, dass alle meine Dateien geändert hatten.

Revbuffs hilft Ihnen, mit den Symptomen davon fertig zu werden. Es ermöglicht Ihnen, dass alle Ihre Puffer neu geladen werden.

Sie können auch versuchen, (global-auto-revert-mode), die automatisch Ihre Dateien zurücksetzt, was auf der Festplatte ist.

8

Ich habe folgendes in meinem .emacs. Es lässt Emacs nur nach wirklich geänderten Dateien fragen. Wenn eine Datei byteweise gleich bleibt und nur ihr Zeitstempel aktualisiert wird, wie es beim Wechseln von Zweigen in VCS häufig der Fall ist, wird diese "Änderung" von Emacs ignoriert.

;; Ignore modification-time-only changes in files, i.e. ones that 
;; don't really change the contents. This happens often with 
;; switching between different VC buffers. 

(defun update-buffer-modtime-if-byte-identical() 
    (let* ((size  (buffer-size)) 
     (byte-size (position-bytes size)) 
     (filename buffer-file-name)) 
    (when (and byte-size (<= size 1000000)) 
     (let* ((attributes (file-attributes filename)) 
      (file-size (nth 7 attributes))) 
     (when (and file-size 
        (= file-size byte-size) 
        (string= (buffer-substring-no-properties 1 (1+ size)) 
          (with-temp-buffer 
           (insert-file-contents filename) 
           (buffer-string)))) 
      (set-visited-file-modtime (nth 5 attributes)) 
      t))))) 

(defun verify-visited-file-modtime--ignore-byte-identical (original &optional buffer) 
    (or (funcall original buffer) 
     (with-current-buffer buffer 
     (update-buffer-modtime-if-byte-identical)))) 
(advice-add 'verify-visited-file-modtime :around #'verify-visited-file-modtime--ignore-byte-identical) 

(defun ask-user-about-supersession-threat--ignore-byte-identical (original &rest arguments) 
    (unless (update-buffer-modtime-if-byte-identical) 
    (apply original arguments))) 
(advice-add 'ask-user-about-supersession-threat :around #'ask-user-about-supersession-threat--ignore-byte-identical) 
+0

+1 Das ist sehr ähnlich zu dem, was ich dachte, aber es wird nur richtig funktionieren, wenn der Puffer nicht ungespeicherte Änderungen hat. Ich dachte, ich würde ein assoziiertes Array von Puffer SHA1s (oder MD5 oder was auch immer billig genug ist, um im laufenden Betrieb zu berechnen und robust genug gegen Kollisionen) und aktualisieren, wenn eine neue Datei besucht wird oder wenn ich eine Datei speichern. Wenn die Datei mit dem aktualisierten Zeitstempel denselben Hashwert hat, ist die Warnung nicht erforderlich. – tripleee

+0

Ja, es ist genau so, wie Sie es beschrieben haben und hat diesen unbehandelten Fall. Aber es ist genug für mich, weil ich die Gewohnheit habe, oft Puffer zu sparen. – doublep

+0

@doublep du bist mein Held! – EoghanM

3

In meinem Fall wollte ich:

(setq revert-without-query '(".*")) 

Dokumentation für revert-without-query:

Specify which files should be reverted without query. 
The value is a list of regular expressions. 
If the file name matches one of these regular expressions, 
then ‘revert-buffer’ reverts the file without querying 
if the file has changed on disk and you have not edited the buffer. 
Verwandte Themen