2010-12-15 28 views
18

¿Elisp tiene una función que toma una url y un destino y descarga esa url de Internet?Descargar un archivo con Emacs Lisp

he descubierto url-retrieve y url-retrieve-synchronously pero url-retrieve toma una devolución de llamada y url-retrieve-synchronously pone todo en una memoria intermedia. ¿Hay algo más simple?

+0

Si solo desea obtener el archivo remoto en un búfer de Emacs, 'browse-url-emacs' es útil. – phils

Respuesta

24

Probar url-copy-file. Su descripción es:

url-copy-file es una función de Lisp autocargada en `url-handlers.el '.

(-copia-archivo URL url newname & opcional ok-si-already-exists keep-tiempo)

Copiar URL para nuevo_nombre. Ambos argumentos deben ser cadenas. Indica un error 'file-already-exists' si el archivo newname ya existe, a menos que se suministre un tercer argumento ok-if-already-exists y no sea nulo. Un número como tercer arg significa confirmación de solicitud si newname ya existe. Esto es lo que sucede en el uso interactivo con M-x. Cuarto arg keep-time no-nil significa darle al nuevo archivo el mismo tiempo de última modificación que el anterior. (Esto solo funciona en algunos sistemas). Un prefijo arg hace que el tiempo de permanencia no sea nulo.

+0

Tuve que '' 'requerir' url''' para usar '' 'url-copy-file''' –

+1

(Para principiantes de Emacs) Si quieres usar esto como' wget' (es decir, no como parte de un programa o función) puede escribir 'ESC:' (que solicita una expresión elisp a eval) y luego escribir: '(url-copy-file" http://example.com/ "" filename.txt ")' –

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

Si bien esto es cierto, 'url-copy-file' funciona en plataformas en las que w3m no se ha portado. – JasonFruit

7

Obviamente url-copy-file es la mejor opción, pero a los piratas informáticos Emacs más aventureros me gustaría sugerir algo como esto:

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

Recuperando URL | http://www.gnu.org/software/emacs/manual/html_node/url/Retrieving-URLs.html

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

Cuestiones relacionadas