2010-02-17 8 views

Respuesta

16

Emacs realmente está tratando de ayudarlo aquí. Lea la página de información en Protection against Simultaneous Editing.

Pero, si todavía quiere evitar que el mensaje/solicitud, puede redefinir la función que está haciendo la moción:

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

La segunda función no es para cuando dos personas están utilizando Emacs para editar el mismo archivo, y proporcionaría un mensaje similar (pero no el que parecías consultar en la pregunta).

Aconsejaría que no anule las dos rutinas, pero está ahí si lo desea.


En caso de que global-auto-revert-mode esté activado, podría deshabilitarlo. Agregue esto a su .emacs:

(global-auto-revert-mode -1) 

Se puede saber si el modo está activado observando la variable del mismo nombre:

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

Si el valor es t, a continuación, el modo está activado de lo contrario, está apagado.

+4

El aparece mucho cuando se ejecuta emacs en VMWare y archivos Editting en/mnt/HGF (enlaces para alojar carpetas de máquina). El reloj de VMWare no se sincroniza con el host. En ocasiones, incluso puede ver el resultado de que las llamadas del sistema de tiempo salten hacia atrás en el tiempo. Entonces, ... ¿es posible deshabilitar la verificación solo cuando se editan archivos en un directorio específico? (Por ejemplo,/mnt/hgfs?) – user48956

+1

Esta solución también es necesaria cuando se usa Emacs en Windows a través de Parallels en OSX para modificar archivos en el OSX nativo/host. Además de modificar 'ask-user-about-supresión-amenaza', también modifiqué' basic-save-buffer' con un 'defalias' y una nueva función que omite/quita:' (o (verify-visited-file- modtime (current-buffer)) (no (file-exists-p buffer-file-name)) (yes-or-no-p (formato "% s ha cambiado desde que se visitó o se guardó. ¿Guardar de todos modos?" (file-name -nondirectory buffer-file-name))) (error de usuario "Guardar no confirmado")) '. – lawlist

+0

Emacs realmente debería verificar que el contenido del archivo haya cambiado y no solo las marcas de tiempo. Esto sucede en todos mis buffers cada vez que cambio git branches temporalmente y lo cambio de dirección (o git stash save/pop). * Edit * acaba de descubrir la respuesta de @doublep – EoghanM

9

Tuve molestia con esto porque cada vez que cambiaba de ramas en git, emacs pensaba que todos mis archivos habían cambiado.

Revbuffs lo ayuda a lidiar con los síntomas de esto. Le permite hacer que todos sus búferes sean recargados.

También puedes probar (global-auto-revert-mode) que automáticamente revertirá tus archivos a lo que está en el disco.

8

Tengo lo siguiente en mi .emacs. Hace que Emacs solo pregunte por los archivos realmente cambiados. Si un archivo permanece igual bytewise, solo se actualiza su marca de tiempo, como sucede a menudo cuando se cambian las sucursales en VCS, Emacs ignora este "cambio".

;; 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 Esto es muy similar a lo que estaba pensando, pero solo funcionará correctamente si el buffer no tiene cambios no guardados. Pensaba que mantendría una matriz asociada de SHA1 de búfer (o MD5 o lo que sea lo suficientemente económico como para calcular sobre la marcha y lo suficientemente robusto contra choques) y actualizarlo cada vez que se visita un nuevo archivo o cada vez que guardo un archivo. Entonces, si el archivo con la marca de tiempo actualizada tiene el mismo hash, la alerta es innecesaria. – tripleee

+0

Sí, es tal como lo describió y tiene ese estuche no manipulado. Pero es suficiente para mí, porque tengo la costumbre de guardar buffers con frecuencia. – doublep

+0

@doublep eres mi héroe! – EoghanM

3

En mi caso yo quería:

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

Documentación para 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. 
Cuestiones relacionadas