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

Text 如何使用elisp处理一系列文件?,text,emacs,elisp,Text,Emacs,Elisp,我是一个编程新手,所以请容忍我在这里 我有一个名为“foo01.txt”、“foo02.txt”等文件的目录,还有一个名为MyFunction的函数。我想将每个文件作为缓冲区打开,在其上运行MyFunction,将缓冲区写入其文件,终止缓冲区,然后移动到系列中的下一个文件,直到所有文件都完成 我想我需要做的所有事情都在烹饪书()中描述过,但我真的不知道如何把它们放在一起。谢谢 由于Emacs的开放性,Emacs的优点在于通常有很多方法可以解决给定的问题 例如,您可以在Emacs中学习一个简单的技

我是一个编程新手,所以请容忍我在这里

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


我想我需要做的所有事情都在烹饪书()中描述过,但我真的不知道如何把它们放在一起。谢谢

由于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
转到第一个(使用向上和向下键),即
a.txt
,然后执行以下操作

  • C-x(开始宏录制
  • f打开该文件
  • M-x myfunction来运行该myfunction
  • C-x C-s以保存文件
  • C-x k关闭该文件,返回dired
  • 向下键转到下一个文件(本例中为
    b.txt
  • C-x)以结束宏
然后对每个文件(从
b.txt
)执行以下操作

  • 要执行宏,它将对
    b.txt
    执行相同的操作,然后指向
    C.txt
    。(如果在两次宏执行之间不执行任何操作,则可以执行
    e
    重新执行宏)
小心不要在不希望处理的对象上运行宏

注:

  • 如果在创建宏的过程中出错,Emacs将中断录制过程(因此,C-x将抱怨没有录制宏)。在这种情况下,必须从C-x()重新启动宏
  • C键是控制键,M键是元键,通常是Alt键。C-XK表示控制x,然后是k键
答案 如果您正在纯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$")))
进程文件
将迭代给定目录中的每个文件,并将
进程文件
应用于所有.txt文件。您可以这样调用它:

(process-files "~/target-directory")
您可以将其复制到*scratch*缓冲区中,并对各个部件进行处理。最有趣的功能是:

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

学习口齿不清
如果您是为了学习Lisp,我可以推荐您。您可以使用Elisp阅读大量的书籍。否则,请下载一个常见的Lisp环境,如。

我没有想到这一点。我希望掌握使用Lisp的诀窍,但这可能会更简单,对我来说是一个更简单的解决方案。