Как я могу проверить, существует ли файл с помощью Emacs Lisp?
Я хотел бы, чтобы 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))))
что я могу использовать для "???файл-существует???"?
Как только я найду это, я добавлю "mark-read-only" к соответствующему крючку (который, я думаю, является крючком для поиска файлов).
фон
мы используем:lzz как a генератор кода для упрощения нашего процесса разработки 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 ответов:
попробовать
file-exists-p" возвращает t, если файл filename существует (независимо от того, можете ли вы его прочитать.)"
в зависимости от того, что вам нужно, вы, возможно, захотите
file-readable-pвместоfile-exists-p.кстати будет только получить вас до сих пор. сосульки предоставляет по поводу завершения и прогрессивный завершения которые позволяют легко найти помощь для команды, функции, переменной и т. д. имена, соответствующие подразделам в произвольном порядке (is it
file-exists-pилиexists-file-p?).
использовать
f.el, современная библиотека для работы с файлами и каталогами. Вы можете использоватьf-exists?,f-file?,f-directory?и многие другие предикаты. Библиотека лучше, чем стандартные функции, потому что это все связанные с файлами функции, которые вам когда-либо понадобятся в одном пространстве имен.
Comments