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

Ric*_*den 66 emacs elisp

我希望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))))
Run Code Online (Sandbox Code Playgroud)

我可以用什么来"??? file-exists ???"?

一旦我找到了这个,我就会在适当的钩子上添加"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))
       )
    )
  )
Run Code Online (Sandbox Code Playgroud)

cob*_*bal 91

尝试 file-exists-p

"如果文件文件名存在,则返回t(无论你是否可以阅读它.)"

  • file-exists-p不会显示在"CH a"下,因为它不是"交互"功能.它应该出现在"Mx apropos"之下. (17认同)
  • 这就是为什么我在我的.emacs中有这个(define-key help-map"a"'apropos)那样"Ch a"找到了所有符号. (11认同)
  • 是的,它被称为`file-directory-p`. (9认同)
  • 当我执行"CH a"appros搜索时,为什么不显示此功能?我尝试搜索文件并查看"存在"的结果,并且根本没有匹配存在! (4认同)
  • @Trey你也可以将`apropos-do-all`设置为非nil来获得`apropos-command`(默认的"Ch a"绑定)来搜索非交互式函数 (3认同)
  • 使用带有“Ch a”的前缀命令也可以获得非交互功能。'古恰' (2认同)

Dre*_*rew 17

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

  • Apropos只会让你到目前为止. Icicles提供了apropos完成渐进式完成,让您可以轻松地找到命令,函数,变量等名称,这些名称以任意顺序匹配子部分(是file-exists-pexists-file-p?).


Mir*_*lov 8

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