首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Emacs Lisp检查文件是否存在?

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

Stack Overflow用户
提问于 2009-06-03 09:03:16
回答 3查看 24.2K关注 0票数 73

我希望emacs在打开文件时将生成的文件标记为只读。我遗漏的部分是如何检查一个文件是否“存在”。我目前有以下内容:

代码语言:javascript
复制
;;
;; 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指出了要使用的正确函数。

这是生成的代码(基于其他注释的更新也在这里):

代码语言:javascript
复制
(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))
       )
    )
  )
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-06-03 09:08:47

试试file-exists-p

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

请注意,它不是专门针对文件的,也适用于目录。

票数 105
EN

Stack Overflow用户

发布于 2011-09-05 09:14:48

根据你的需要,你可能想要file-exists-p.

  • Apropos而不是
  • ,这只能满足你的需求。提供了apropos completionprogressive completion,使您可以轻松地查找命令、函数、变量等名称的帮助,这些名称可以按任意顺序匹配子部分(是file-exists-p还是that
票数 17
EN

Stack Overflow用户

发布于 2014-03-14 23:24:47

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/943760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档