将 elisp 函数应用于任何文件

Apply elisp function to any file

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

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

我觉得你想做

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

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

如果你还想清理缓冲区等,你可以使用

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

如果您使用库 Dired+ (dired+.el).

,您可以轻松地对 Dired 的标记文件执行此操作
    Dired 中的
  • @ 提示您输入函数(函数名称或 lambda 表达式),然后将函数应用于标记的文件。

    默认情况下,它会将函数应用于每个标记的文件 name。该函数可以做任何你喜欢的事情,但它需要接受一个文件名作为参数。 (该函数不需要访问文件。)

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

  • M-+ @在Dired中做同样的事情,但是它作用于所有标记的文件和标记在任何标记子目录中的所有文件,定义递归。 (M-+ 是对标记文件进行操作的前缀键,在子目录上递归定义。)

    操作的文件为当前目录中标记的文件 缓冲区,或目录中的所有文件,如果 none 被标记。标示 子目录以相同的方式递归处理。

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

    任何其他前缀 arg 的行为根据 dired-get-marked-filesDired+ 版本的 ARG 参数。特别是,C-u C-u 对 Dired 缓冲区中的 all 文件进行操作 - 它会忽略标记。 更准确地说:

    • 如果 ARG 是一个 整数 ,则对下一个 ARG 个文件进行操作(前一个 -ARG,如果< 0).

    • 如果ARG是元素16、64或256的cons,对应 C-u C-u, C-u C-u C-u, 或者C-u C-u C-u C-u, 那么对 Dired 缓冲区中的 all 个文件执行操作,其中:

      • 16 包括 no 个目录(包括 ...

      • 64 包括目录 除了 ...

      • 256包括所有个目录(包括...

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