Je voudrais qu'emacs marque les fichiers générés comme étant en lecture seule lorsqu'ils sont ouverts. La partie du puzzle qui me manque est comment vérifier si un fichier "existe". J'ai actuellement les éléments suivants :
;;
;; 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))))
Que puis-je utiliser pour "???file-exists ???"?
Une fois que je l'aurai trouvé, j'ajouterai "mark-read-only" au crochet approprié (qui, je pense, est le find-file-hook).
CONTEXTE
Nous utilisons lzz comme générateur de code pour simplifier notre processus de développement C/C++. En bref, lzz prend un seul fichier d'entrée (qui ressemble beaucoup à du C/C++) et génère des fichiers d'en-tête et source comme il se doit.
Par défaut, lzz inclut les directives #line afin que le débogueur pointe vers le source original et non vers le source généré. Cependant, pour réduire les dépendances de compilation, nous désactivons normalement ces directives dans les fichiers d'en-tête. Cependant, pour réduire les dépendances de compilation, nous désactivons normalement ces directives dans les fichiers d'en-tête. Le résultat est que lors du débogage de modèles ou de fonctions en ligne, le débogueur pointe normalement vers le fichier d'en-tête généré et non vers le fichier source original.
Ce n'est pas très grave, mais j'ai récemment constaté que, lors du débogage, j'apportais une modification rapide au fichier affiché, puis je le reconstruisais. Bien sûr, cela signifie normalement que la modification que j'ai apportée disparaît parce que le fichier que j'ai modifié est généré et que les modifications sont donc "effacées" lors de la reconstruction de la bibliothèque.
SOLUTION
Merci à tous pour leur aide et leurs commentaires. Un merci particulier à cobalt pour avoir indiqué la bonne fonction à utiliser.
Voici le code résultant (avec des mises à jour basées sur les autres commentaires ici aussi) :
(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))
)
)
)