将elisp函数应用于任何文件

时间:2015-04-14 04:17:27

标签: emacs elisp

如何将elisp函数应用于特定文件,该文件不在打开的缓冲区中?

例如(my/apply delete-duplicate-lines "~/tmp")

3 个答案:

答案 0 :(得分:4)

我想你想做

(with-current-buffer (find-file-noselect "~/tmp")
  (delete-duplicate-lines (point-min) (point-max))
  (save-buffer))

如果您想了解有关如何以编程方式操作缓冲区内容的更多信息,请阅读此section of the manual

答案 1 :(得分:3)

如果您还需要清理缓冲区等,可以使用

(let ((file "~/tmp"))
  (with-temp-file file
    (insert-file-contents file)
    (delete-duplicate-lines (point-min) (point-max))))

答案 2 :(得分:2)

如果您使用库Dired+dired+.el),则可以轻松对已标记的Dired文件执行此操作。

    Dired中的
  • @ 会提示您输入函数(函数名或lambda表达式),然后将该函数应用于标记的文件。

    默认情况下,它将函数应用于每个标记的文件 name 。该函数可以执行任何您喜欢的操作,但它需要接受文件名作为参数。 (该功能无需访问该文件。)

    使用普通前缀arg(C-u),每个标记的文件都是访问,并且在访问缓冲区中调用该函数(没有参数)。

  • Dired中的
  • M-+ @ 执行相同的操作,但它会对所有标记的文件以及标记在任何已标记子目录中的所有文件执行操作,并以递归方式定义 。 (M-+是对标记文件的操作的前缀键,在子目录上递归定义。)

    处理的文件是当前Dired中标记的文件 缓冲区,或目录中的所有文件(如果没有标记)。标记 子目录以相同的方式递归处理。

    @一样,普通前缀arg(C-u)表示访问每个文件并调用不带参数的函数。

    任何其他前缀arg的行为均符合ARG Dired + 版本的dired-get-marked-files参数。特别是,C-u C-u操作Dired缓冲区中的 所有 文件 - 它会忽略标记。 更确切地说:

    • 如果ARG整数,请对下一个ARG文件执行操作(上一个 - ARG,如果< 0)。

    • 如果ARG是元素16,64或256的缺点,则对应于 C-u C-u C-u C-u C-u C-u C-u C-u C-u ,然后执行全部 Dired缓冲区中的文件,其中:

      • 16包含目录(包括...

      • 64包含目录 ...

      • 除外
      • 256包含所有目录(包括...

    • 如果ARG不是nil,则仅对当前文件执行操作。