如何使用 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”添加到适当的钩子(我认为是 find-file-hook)。

背景

我们使用 伊丝作为代码生成器来简化 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))
)
)
)
25500 次浏览

试试 file-exists-p

“如果文件文件名存在,返回 t (无论您是否能够读取它。)”。

请注意,它不是特定于文件的,也适用于目录。

  • 根据您的需要,您可能需要 file-readable-p而不是 file-exists-p

  • 恰到好处只能让你走到这一步。冰柱提供了 完成得恰到好处逐步完成,它们可以让您轻松地找到命令、函数、变量等名称的帮助,这些名称以任意顺序匹配子部件(是 file-exists-p还是 exists-file-p?).

使用 f.el,现代的文件和目录操作库。可以使用 f-exists?f-file?f-directory?和许多其他谓词。这个库比标准函数要好,因为它是您在一个名称空间下需要的所有与文件相关的函数。