2010-12-15 17 views
18

Hat elisp eine Funktion, die eine URL und ein Ziel und lädt diese URL aus dem Internet?Laden Sie eine Datei mit Emacs Lisp

ich entdeckt habe url-retrieve und url-retrieve-synchronously aber url-retrieve nimmt einen Rückruf und url-retrieve-synchronously bringt alles in einen Puffer. Gibt es etwas einfacheres?

+0

Wenn Sie nur die Remote-Datei in einen Emacs-Puffer bekommen wollen, ist 'browse-url-emacs' praktisch. – phils

Antwort

24

Versuchen Sie url-copy-file. Seine Beschreibung lautet:

url-copy-file ist eine automatisch geladene Lisp-Funktion in `url-handlers.el '.

(url-copy-Datei-URL newname & optional ok-if-already-exists halte Zeit)

Copy URL newname. Beide Argumente müssen Strings sein. Signalisiert einen `Datei-bereits-existiert'-Fehler, wenn Dateienname bereits existiert, , es sei denn, ein drittes Argument ok-wenn-schon-existiert wird geliefert und nicht-nil. Eine Nummer als drittes Argument bedeutet eine Bestätigung der Anfrage, wenn ein neuer Name bereits existiert. Dies geschieht bei der interaktiven Verwendung mit M-x. Vierte arg keep-time non-nil bedeutet, geben Sie der neuen Datei die gleiche Last-modifizierte Zeit als die alte. (Dies funktioniert nur auf einigen Systemen.) Ein Präfix-Argument macht Keep-Time nicht-Null.

+0

Ich musste '' '' 'url''' verwenden, um' 'url-copy-file''' –

+1

(Für Emacs-Neulinge) zu verwenden. Wenn Sie das wie' wget' verwenden möchten (dh nicht als Teil von ein Programm oder eine Funktion) können Sie 'ESC:' eingeben (was zu einem elisp-Ausdruck für eval auffordert) und dann folgendes eingeben: '(url-copy-file" http://example.com/ "" filename.txt ")' –

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

Obwohl dies zutrifft, funktioniert 'url-copy-file' auf Plattformen, auf die w3m nicht portiert wurde. – JasonFruit

7

Offensichtlich url-copy-file ist die beste Option, aber den abenteuerlichen Emacs Hacker würde ich so etwas wie dies vorschlägt:

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

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

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