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))
)
)
)
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 –
Nota: sus dos primeras funciones vienen con Emacs, se llaman 'file-name-extension' y 'file-name-sans-extension –