73

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

3 回答 3

105

尝试file-exists-p

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

请注意,它并不适用于文件,也适用于目录。

于 2009-06-03T09:08:46.870 回答
17
  • 根据您的需要,您可能想要file-readable-p而不是file-exists-p.

  • Apropos 只会让你走这么远。 Icicles提供了适当的补全渐进补全,让您可以轻松地找到以任意顺序匹配子部分的命令、函数、变量等名称的帮助(是它file-exists-p还是exists-file-p?)。

于 2011-09-05T01:14:47.753 回答
8

Use f.el, modern library for file and directory manipulation. You can use f-exists?, f-file?, f-directory? and many other predicates. The library is better than standard functions, because it's every file related function you'll ever need under one namespace.

于 2014-03-14T15:24:46.797 回答