我希望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文件钩子)。
背景
我们使用
lzz
作为一个代码生成器来简化我们的C/C++开发过程。简单地说,LZZ采用一个单一的输入文件(它看起来非常类似C/C++),并根据需要生成头文件和源文件。
默认情况下,LZZ包含行指令,以便调试器指向原始源而不是生成的源,但是,为了减少编译依赖性,我们通常在头文件中禁用这些指令。结果是,在调试模板或内联函数时,调试器通常指向生成的头文件,而不是原始源文件。
不过,这不是什么大问题,最近我发现在调试时,我将快速修改显示的文件,然后重新生成。当然,这通常意味着我所做的更改会消失,因为我编辑的文件是生成的,所以在库重建期间更改会被“吹走”。
解决方案
感谢大家的帮助和评论。特别感谢
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))
)
)
)