Как я могу проверить, существует ли файл с помощью Emacs Lisp? - PullRequest
64 голосов
/ 03 июня 2009

Я бы хотел, чтобы emacs помечал файлы, которые генерируются только для чтения, когда они открыты. Часть головоломки, которую я пропускаю, - как проверить, существует ли файл. В настоящее время у меня есть следующее:

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

Что я могу использовать для "??? file-существующие ???"?

Как только я найду это, я добавлю "mark-only-only" к соответствующему хуку (который, я думаю, является find-file-hook).

ФОН

Мы используем lzz в качестве генератора кода, чтобы упростить процесс разработки C / C ++. Вкратце, lzz берет один входной файл (который очень похож на C / C ++) и генерирует заголовочные и исходные файлы соответствующим образом.

По умолчанию lzz включает директивы #line, так что отладчик указывает на исходный источник, а не на сгенерированный источник, однако, чтобы уменьшить зависимости компиляции, мы обычно отключаем эти директивы в заголовочных файлах. В результате при отладке шаблонов или встроенных функций отладчик обычно указывает на сгенерированный заголовочный файл, а не на исходный исходный файл.

Это не имеет большого значения, однако недавно я обнаружил, что при отладке я быстро изменю отображаемый файл, а затем перестрою. Конечно, это обычно означает, что внесенные мною изменения исчезают, потому что созданный мною файл сгенерирован, и поэтому эти изменения «сдуваются» во время перестройки библиотеки.

РЕШЕНИЕ

Спасибо всем за помощь и комментарии. Особая благодарность cobbal за указание правильной функции для использования.

Вот результирующий код (с обновлениями на основе других комментариев здесь):

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

89 голосов
/ 03 июня 2009

попробуй file-exists-p

"Вернуть t, если имя файла существует (независимо от того, можете ли вы его прочитать.)"

17 голосов
/ 05 сентября 2011
  • В зависимости от того, что вам нужно, вы можете захотеть file-readable-p вместо file-exists-p.

  • Кстати, ты пока только доберешься. Сосульки обеспечивает по поводу завершения и прогрессивное завершение , что позволяет легко найти помощь для команды, функции, переменной, и т. д. имена, которые соответствуют частям в произвольном порядке (это file-exists-p или exists-file-p?).

8 голосов
/ 14 марта 2014

Использование f.el, современная библиотека для работы с файлами и каталогами. Вы можете использовать f-exists?, f-file?, f-directory? и многие другие предикаты. Библиотека лучше стандартных функций, потому что каждая функция, связанная с файлами, вам когда-либо понадобится в одном пространстве имен.

...