73 votes

Comment puis-je vérifier si un fichier existe en utilisant Emacs Lisp ?

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

105voto

cobbal Points 37900

Essayez file-exists-p

"Retourne t si le fichier filename existe (que vous puissiez le lire ou non.)"

17voto

Drew Points 12071
  • En fonction de vos besoins, vous pourriez vouloir file-readable-p au lieu de file-exists-p .

  • L'à-propos ne vous mènera pas loin. Icicles fournit achèvement opportun et achèvement progressif qui vous permettent de trouver facilement de l'aide pour les noms de commandes, de fonctions, de variables, etc. qui correspondent à des sous-parties dans un ordre arbitraire (s'agit-il de file-exists-p ou exists-file-p ?).

8voto

sindikat Points 3533

Utilisez f.el Une bibliothèque moderne pour la manipulation des fichiers et des répertoires. Vous pouvez utiliser f-exists? , f-file? , f-directory? et de nombreux autres prédicats. La bibliothèque est meilleure que les fonctions standard, car elle regroupe toutes les fonctions liées aux fichiers dont vous aurez besoin dans un seul espace de noms.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X