4

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

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

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

4

2 回答 2

6

回答

如果您正在寻找纯 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 环境。

于 2013-02-03T10:32:02.743 回答
4

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

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

这是一个可怕的清单,例如来自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-keyControl 键,通常M-keyMeta 键Alt-key。并且C-x k意味着Control x 然后 k key
于 2013-02-03T07:53:06.697 回答