2009-06-03 36 views
58

我希望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)) 
     ) 
    ) 
) 
+3

您可以在函数声明的第一行写入它们,而不是将函数注释到函数的上面。它称之为“文档字符串”。见http://www.gnu。org/software/emacs/elisp/html_node/Documentation-Basics.html – 2009-06-03 12:39:25

+9

注意:前两个函数附带Emacs,它们被命名为'file-name-extension'和'file-name-sans-extension – 2009-06-03 15:49:40

回答

79

尝试,如果文件名存在file-exists-p

“返回T(你是否能读它。) “

14
  • 取决于你需要什么,你可能想file-readable-p而不是file-exists-p

  • Apropos只会让你到目前为止。 Icicles提供了apropos completionprogressive completion,它们让您轻松找到与任意顺序的子部件匹配的命令,函数,变量等名称的帮助(它是file-exists-p还是exists-file-p?)。

7

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