【问题标题】:How to process a series of files with elisp?如何用elisp处理一系列文件?
【发布时间】:2025-06-18 22:45:02
【问题描述】:

我是编程新手,所以请耐心等待...

我有一个包含名为“foo01.txt”、“foo02.txt”等文件的目录和一个名为MyFunction 的函数。我想将每个文件作为缓冲区打开,在其上运行MyFunction,将缓冲区写入其文件,终止缓冲区并移至系列中的下一个文件,直到所有文件都完成。

我认为我需要执行此操作的所有部分都在 Cookbook (http://emacswiki.org/emacs/ElispCookbook) 中进行了描述,但我并不真正了解如何将它们组合在一起。谢谢!

【问题讨论】:

    标签: text emacs elisp


    【解决方案1】:

    回答

    如果您正在寻找纯 elisp 的答案,您可以这样做:

    (defun process-file (f)
      (save-excursion 
        (find-file f)
        (my-function)     ; Call your function here.
        (write-file f)
        (kill-buffer (current-buffer))))
    
    (defun process-files (dir) 
      (mapc 'process-file
            (directory-files dir t ".txt$")))
    

    process-files 将遍历给定目录中的每个文件并将process-file 应用于所有 .txt 文件。你可以这样称呼它:

    (process-files "~/target-directory")
    

    您可以将其复制到 *scratch* 缓冲区中,然后玩弄各个部分。最有趣的功能是:

    • mapc - 将函数应用于列表中的每个项目
    • directory-files - 获取目录中的所有文件和文件夹,在本例中检索所有 .txt 文件
    • find-file - 在缓冲区中打开一个文件(这是在您键入 C-x C-f 时运行的内容)

    学习 Lisp

    如果你是为了学习 Lisp 而学习 Lisp,我可以推荐 Practical Common Lisp。您将能够使用 Elisp 完成令人惊讶的大量书籍。否则,请下载像 SBCL 这样的 Common Lisp 环境。

    【讨论】:

      【解决方案2】:

      Emacs 的优点在于,由于 Emacs 的开放性,通常有很多方法可以解决给定的问题。

      例如,您可以在 Emacs 中学习一个简单的技巧,它现在和将来都会对您有所帮助:

      这是一个 dired 列表,例如来自 C-x f/home/me/mydir/

        /home/me/mydir:
        total used in directory 32 available 5575136
        drwxr-xr-x  10 me  brainers   340 Jan 18 15:50 .
        drwxr-xr-x  78 me  brainers  2652 Feb  2 18:08 ..
        -rw-r--r--   4 me  brainers   136 Apr  1  2012 a.txt
        -rw-r--r--  16 me  brainers   544 Feb  1 09:56 b.txt
        -rw-r--r--   6 me  brainers   204 Apr  6  2012 c.txt
      

      转到第一个(使用 updown 键),即a.txt,然后执行

      • C-x ( 开始录制宏
      • f 打开该文件
      • M-x myfunction 来运行那个 myfunction 函数
      • C-x C-s 保存文件
      • C-x k 关闭该文件,返回 dired
      • down 键转到下一个文件(在这种情况下为b.txt
      • C-x ) 结束宏

      然后对于每个文件(来自b.txt),执行

      • C-x e 来执行宏,它会和b.txt做同样的事情,然后指向c.txt。 (如果您在两次宏执行之间不做任何事情,您可以直接使用 e 重新执行宏)

      注意不要在你不想被处理的东西上运行宏。

      注意事项:

      • 如果您在创建宏的过程中出现任何错误,Emacs 将中断录制过程(因此,C-x ) 会抱怨没有录制宏)。在这种情况下,必须从 C-x (.
      • 重新启动宏
      • C-key控制键M-key元键通常是Alt-key kbd>。而 C-x k 的意思是 Control x then k key

      【讨论】:

      • 我没有想到这一点。我想掌握使用 Lisp 的窍门,但这对于我来说可能更容易,也更容易作为一种直接的解决方案。