2010-12-15 69 views
18

Est-ce que elisp a une fonction qui prend une url et une destination et télécharge cette URL depuis Internet?Télécharger un fichier avec Emacs Lisp

J'ai découvert url-retrieve et url-retrieve-synchronously mais url-retrieve prend un rappel et url-retrieve-synchronously met tout dans un tampon. Y a-t-il quelque chose de plus simple?

+0

Si vous voulez juste obtenir le fichier distant dans un tampon Emacs, 'browse-url-emacs' est pratique. – phils

Répondre

24

Essayez url-copy-file. Sa description se lit,

-fichier url-copie est une fonction Lisp autochargée dans `url-handlers.el.

(url-copy-file url nouveaunom & option ok-si-déjà existe keep-temps)

Copier URL pour nouveau_nom. Les deux arguments doivent être des chaînes. Signale une erreur `file-already-exists 'si le nouveau nom de fichier existe déjà, sauf si un troisième argument ok-if-already-exists est fourni et non-nul. Un nombre en tant que troisième argument signifie une demande de confirmation si le nouveau nom existe déjà. C'est ce qui se passe en utilisation interactive avec M-x. Le quatrième temps de maintien non nul signifie que le nouveau fichier a la même durée que l'ancien dernière modification. (Cela ne fonctionne que sur certains systèmes.) Un préfixe arg rend le temps de maintien non nul.

+0

Je devais '' 'require 'url''' pour utiliser' '' url-copy-file''' –

+1

(Pour les débutants Emacs) Si vous voulez utiliser ceci comme 'wget' (c'est-à-dire pas comme faisant partie de un programme ou une fonction) vous pouvez taper 'ESC:' (qui demande une expression elisp pour eval) puis taper: '(url-copy-file" http://example.com/ "" filename.txt ")' –

4
(w3m-download "http://www.gnu.org/index.html") 
+2

Bien que cela soit vrai, 'url-copy-file' fonctionne sur les plateformes sur lesquelles w3m n'a pas été porté. – JasonFruit

7

Il est évident que url-copy-file est la meilleure option, mais pour les pirates Emacs plus aventureux, je vous suggère quelque chose comme ceci:

(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)))))))))) 
3

http://steloflute.tistory.com/entry/Emacs-Lisp-urlretrieve

; synchronously  
(defun get-url (url) 
    (with-current-buffer (url-retrieve-synchronously url) (buffer-string))) 

(print (get-url "http://www.gnu.org")) 

; asynchronously  
(defun print-url (url) 
    (url-retrieve url (lambda (a) (print a)))) 

(print-url "http://www.gnu.org") 

URL Récupération | http://www.gnu.org/software/emacs/manual/html_node/url/Retrieving-URLs.html

Tampon de courant | http://www.gnu.org/software/emacs/manual/html_node/elisp/Current-Buffer.html