代码之家  ›  专栏  ›  技术社区  ›  Richard Corden

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

  •  62
  • Richard Corden  · 技术社区  · 16 年前

    我希望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文件钩子)。

    背景

    我们使用 lzz 作为一个代码生成器来简化我们的C/C++开发过程。简单地说,LZZ采用一个单一的输入文件(它看起来非常类似C/C++),并根据需要生成头文件和源文件。

    默认情况下,LZZ包含行指令,以便调试器指向原始源而不是生成的源,但是,为了减少编译依赖性,我们通常在头文件中禁用这些指令。结果是,在调试模板或内联函数时,调试器通常指向生成的头文件,而不是原始源文件。

    不过,这不是什么大问题,最近我发现在调试时,我将快速修改显示的文件,然后重新生成。当然,这通常意味着我所做的更改会消失,因为我编辑的文件是生成的,所以在库重建期间更改会被“吹走”。

    解决方案

    感谢大家的帮助和评论。特别感谢 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 回复  |  直到 16 年前
        1
  •  87
  •   cobbal    16 年前

    尝试 file-exists-p

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

        2
  •  15
  •   Drew    13 年前
    • 根据你的需要,你可能需要 file-readable-p 而不是 file-exists-p .

    • 停机坪只能让你走这么远。 Icicles 提供 apropos completion progressive completion 这使您可以很容易地为命令、函数、变量等以任意顺序匹配子部分的名称找到帮助(是吗? 文件存在P exists-file-p ?).

        3
  •  7
  •   Mirzhan Irkegulov    11 年前

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