如何使用Elisp处理一系列文件?

4

我是一个编程新手,请谅解我的问题...

我有一个文件夹,里面有许多名为“foo01.txt”,“foo02.txt”等的文件,并且有一个叫做MyFunction的函数。我想打开每个文件作为缓冲区,在其上运行MyFunction,将缓冲区写入其文件,关闭缓冲区并继续进行下一个文件,直到所有文件都完成。

我认为我需要做这件事的所有组件都在菜谱中描述了 (http://emacswiki.org/emacs/ElispCookbook),但我不太明白如何将它们组合起来。谢谢!

2个回答

9

答案

如果你正在寻找纯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本身,我可以推荐Practical Common Lisp。你可以使用Elisp完成书中惊人数量的工作。否则,请下载像SBCL这样的Common Lisp环境。


4

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

先进入第一个文件(使用 键),即 a.txt,然后执行以下操作:

  • C-x ( 开始录制宏
  • f 打开该文件
  • M-x myfunction 运行 myfunction 函数
  • C-x C-s 保存文件
  • C-x k 关闭文件,回到 dired
  • 键进入下一个文件(这里是 b.txt
  • C-x ) 结束录制宏

然后对于每个文件(从 b.txt 开始),执行以下操作:

  • C-x e 执行宏,它将对 b.txt 做同样的操作,然后指向 c.txt。(如果两次宏执行之间没有任何操作,则可以直接按 e 重新执行宏)

请注意不要在不想处理的内容上运行宏。

注:

  • 如果在创建宏过程中犯了任何错误,Emacs 将中断录制过程(因此,C-x ) 将抱怨没有正在录制的宏)。这种情况下,必须从 C-x ( 重新开始录制宏。
  • C 键Control 键M 键 通常是 Meta 键,即 Alt 键。而 C-x k 表示先按下 Control x,再按下 k 键

我之前没有想到过这个。虽然我想掌握使用Lisp,但这对我来说可能是一个更容易的、即时的解决方案。 - Brian Z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接