使用Emacs Lisp下载文件

Cri*_*ian 21 emacs elisp

elisp是否具有获取网址和目的地的功能并从网上下载该网址?

我发现url-retrieveurl-retrieve-synchronously,但url-retrieve需要一个回调,并url-retrieve-synchronously把一切都变成一个缓冲区.还有什么更简单的吗?

hua*_*uan 26

试试url-copy-file.它的描述如下:

url-copy-file是`url-handlers.el'中的自动加载的Lisp函数.

(url-copy-file url newname&optional ok-if-already-exists keep-time)

将url复制到newname.两个args必须是字符串.如果文件newname已经存在,则表示"文件已存在"错误,除非提供了ok-if-already-exists的第三个参数且为非nil.如果newname已经存在,则作为第三个arg的数字表示请求确认.这是与Mx交互使用时发生的情况.第四个arg keep-time非零意味着为新文件提供与旧文件相同的最后修改时间.(这仅适用于某些系统.)前缀arg使保持时间不为零.

  • (对于 Emacs 新手)如果你想像 `wget` 一样使用它(即不是作为程序或函数的一部分)你可以输入 `ESC :`(提示输入一个 elisp 表达式来 eval)然后输入:`(url -copy-file "http://example.com/" "filename.txt")` (2认同)

Boz*_*sov 8

显然url-copy-file是最好的选择,但对于更具冒险精神的Emacs黑客,我建议这样的事情:

(require 'url)

(defun download-file (&optional url download-dir download-name)
  (interactive)
  (let ((url (or url
                 (read-string "Enter download URL: "))))
    (let ((download-buffer (url-retrieve-synchronously url)))
      (save-excursion
        (set-buffer download-buffer)
        ;; we may have to trim the http response
        (goto-char (point-min))
        (re-search-forward "^$" nil 'move)
        (forward-char)
        (delete-region (point-min) (point))
        (write-file (concat (or download-dir
                                "~/downloads/")
                            (or download-name
                                (car (last (split-string url "/" t))))))))))
Run Code Online (Sandbox Code Playgroud)