2009-06-03 15 views
58

Me gustaría que emacs marque los archivos que se generan como de solo lectura cuando se abren. La parte del rompecabezas que me falta es cómo verificar si un archivo "existe". Actualmente tengo lo siguiente:¿Cómo puedo verificar si existe un archivo usando Emacs Lisp?

;; 
;; get file extension 
;; 
(defun get-ext (file-name) 
    (car (cdr (split-string file-name "\\.")))) 

;; 
;; get the base name of the file 
;; 
(defun base-name (file-name) 
    (car (split-string file-name "\\."))) 

;; 
;; if an 'lzz' file exists for this header, mark it as read only 
;; 
(defun mark-read-only() 
    (if (string= (get-ext (cur-file)) "h") 
     (if (??file-exists??? (concat (base-name (cur-file)) ".lzz")) 
      (toggle-read-only)))) 

¿Qué puedo usar para "??? file-exists ???"?

Una vez que encuentre esto, agregaré "mark-read-only" al enlace apropiado (que creo que es find-file-hook).

Antecedentes

Utilizamos lzz como un generador de código C para simplificar el proceso de desarrollo de nuestra C/++. En resumen, lzz toma un solo archivo de entrada (que se parece mucho a C/C++) y genera archivos de encabezado y fuente según corresponda.

De forma predeterminada, lzz incluye las directivas #line para que el depurador apunte a la fuente original y no a la fuente generada, sin embargo, para reducir las dependencias de compilación, normalmente desactivamos estas directivas en los archivos de encabezado. El resultado es que al depurar plantillas o funciones en línea, el depurador normalmente apunta al archivo de encabezado generado y no al archivo fuente original.

Esto no es un gran problema, sin embargo, recientemente descubrí que al depurar voy a hacer una modificación rápida en el archivo mostrado y luego lo reconstruiré. Por supuesto, esto normalmente significa que el cambio que he hecho desaparece porque el archivo que edité se genera y por lo tanto los cambios son "volados" durante la reconstrucción de la biblioteca.

SOLUCIÓN

Gracias a todos por su ayuda y comentarios. Un agradecimiento especial al cobbal para señalar la función correcta de usar.

Aquí está el código resultante (con actualizaciones basado en los otros comentarios aquí también):

(defun cur-file() 
    "Return the filename (without directory) of the current buffer" 
    (file-name-nondirectory (buffer-file-name (current-buffer))) 
) 

(defun mark-generated-as-read-only() 
    "Mark generated source files as read only. 
Mark generated files (lzz or gz) read only to avoid accidental updates." 
    (if 
     (or (string= (file-name-extension (cur-file)) "h") 
      (string= (file-name-extension (cur-file)) "cpp")) 
     (cond 
     (
     (file-exists-p (concat (file-name-sans-extension (cur-file)) ".lzz")) 
     (toggle-read-only)) 
     (
     (file-exists-p (concat (file-name-sans-extension (cur-file)) ".gz")) 
     (toggle-read-only)) 
     ) 
    ) 
) 
+3

En lugar de poner comentarios sobre sus funciones, en Elisp, puede escribirlos en la primera línea de una declaración de función. Llamó el "docstring". Ver http: //www.gnu.org/software/emacs/elisp/html_node/Documentation-Basics.html –

+9

Nota: sus dos primeras funciones vienen con Emacs, se llaman 'file-name-extension' y 'file-name-sans-extension –

Respuesta

79

tratar file-exists-p

"retorno t si existe el nombre de archivo del archivo (si o no se puede leer.) "

+2

¿Por qué no esto? función aparece cuando hago una búsqueda de "CH a" appros para ello? Intenté buscar el archivo y ver los resultados de "existe", y no hay ninguna coincidencia para existir. –

+0

sí, traté de buscar 'exists' de esa manera, luego encontré la función 'find-file-existing' en files.el, la abrí y encontré el archivo-exists-p. no sé por qué no aparece en C-H a – cobbal

+12

file-exists-p no aparece en "C-H a" porque no es una función "interactiva". Sin embargo, debería aparecer bajo "M-x apropos". – Edric

14
  • Dependiendo de lo que necesita, es posible que desee file-readable-p en lugar de file-exists-p.

  • Apropos solo le llevará hasta ahora. Icicles proporciona apropos completion y progressive completion que le permiten encontrar ayuda fácilmente para los nombres de comando, función, variable, etc. que coinciden con las subpartes en un orden arbitrario (¿es file-exists-p o exists-file-p?).

7

Use f.el, biblioteca moderna para la manipulación de archivos y directorios. Puede usar f-exists?, f-file?, y muchos otros predicados. La biblioteca es mejor que las funciones estándar, porque cada función relacionada con archivos que necesitará en un espacio de nombres.

Cuestiones relacionadas