我希望emacs标记在打开时生成为只读的文件。我缺少的部分是如何检查文件是否存在。我目前有以下几种:如何使用Emacs Lisp检查文件是否存在?
;;
;; 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-exists ???”?一旦我找到这个,我会添加“标记只读”到适当的钩子(我认为是find-file-hook)。
背景
我们使用lzz作为一个代码生成器来简化我们的C/C++的开发过程。简而言之,lzz需要一个输入文件(它看起来非常像C/C++),并根据需要生成头文件和源文件。
默认情况下,lzz包含#line指令,以便调试器指向原始源而不是生成源,但是为了减少编译依赖性,我们通常在头文件中禁用这些指令。结果是,当调试模板或内联函数时,调试器通常指向生成的头文件而不是原始源文件。
然而,这并不是什么大不了的事,最近我发现调试时我会对显示的文件进行快速修改,然后重新编译。当然,这通常意味着我所做的更改会消失,因为我编辑的文件已生成,因此在库重建期间更改会“消失”。
SOLUTION
感谢大家的帮助和意见。特别感谢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))
)
)
)
您可以在函数声明的第一行写入它们,而不是将函数注释到函数的上面。它称之为“文档字符串”。见http://www.gnu。org/software/emacs/elisp/html_node/Documentation-Basics.html – 2009-06-03 12:39:25
注意:前两个函数附带Emacs,它们被命名为'file-name-extension'和'file-name-sans-extension – 2009-06-03 15:49:40