gpt4 book ai didi

emacs - 如何使用 Emacs Lisp 检查文件是否存在?

转载 作者:行者123 更新时间:2023-12-03 05:30:38 25 4
gpt4 key购买 nike

我希望 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”添加到适当的钩子(Hook)(我认为是 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))
)
)
)

最佳答案

尝试文件存在-p

“如果文件 filename 存在则返回 t(无论是否可以读取)”。

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

关于emacs - 如何使用 Emacs Lisp 检查文件是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/943760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com