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


69

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

背景

我们使用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))
       )
    )
  )

3
您可以在函数声明的第一行中编写注释,而不是在函数上方添加注释。它称为“ docstring”。参见gnu.org/software/emacs/elisp/html_node/…– viam0Zah 2009
6

9
注意:你的前两个函数来使用Emacs,它们被命名为“文件名扩展和”文件名的SAN扩展
特雷·杰克逊

Answers:


97

尝试 file-exists-p

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


4
当我执行“ CH a”批准搜索时,为什么没有显示此功能?我尝试搜索文件,并在结果中查找“存在”,并且根本没有匹配项!
理查德·科登,2009年

17
file-exists-p不在“ CH a”下显示,因为它不是“交互”功能。它应该显示在“ Mx apropos”下。
Edric

11
这就是为什么我在我的.emacs(定义键帮助映射“ a”'apropos)中使用此功能的原因,因此“ Ch a”为我查找所有符号的方式。
Trey Jackson

9
是的,这叫file-directory-p

3
@Trey您还可以设置apropos-do-all为non-nil来获取apropos-command(默认为“ Ch a”绑定)以搜索非交互式函数
scry 2014年

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

  • Apropos只会帮助您到达目标。 Icicles提供适当的补全渐进式补全,使您可以轻松地找到以任意顺序匹配子部分的命令,函数,变量等名称(是file-exists-p还是exists-file-p?)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.