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

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

  •  74
  • 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))))
    

    我可以用什么来表示“文件存在”?

    一旦我找到这个,我会在相应的钩子(我认为是查找文件钩子)中添加“标记为只读”。

    我们使用 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 回复  |  直到 8 年前
        1
  •  87
  •   cobbal    16 年前

    尝试 file-exists-p

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

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

        2
  •  15
  •   Drew    14 年前
    • 根据您的需要,您可能需要 file-readable-p file-exists-p .

    • Apropos只能让你走这么远。 Icicles 提供 apropos completion progressive completion 它使您能够轻松找到以任意顺序匹配子部分的命令、函数、变量等名称的帮助(是吗 exists-file-p ?).

        3
  •  7
  •   Mirzhan Irkegulov    11 年前

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