2010-02-17 10 views
11

Ich versuche, die dired-find-file Funktion in Emacs auf Windows XP zu optimieren, so dass, wenn ich öffne (sagen) eine PDF-Datei von dired es eine Kopie von Acrobat Reader startet und öffnet Datei mit ihm, anstatt es in Emacs zu öffnen. Aber ich kann nicht herausfinden, welche Variante auf shell-command/call-process zu verwenden ist. Hier ist, was ich bisher:Öffnen von Dateien mit Standard-Windows-Anwendung von innerhalb Emacs

(defadvice dired-find-file (around dired-find-file-external (filename &optional wildcards)) 
    "Open non-text files with an appropriate external program." 
    (if (string= ".pdf" (substring filename (- (length filename) 4))) ; obviously I'll replace this with something more general/robust 
    (shell-command filename) ;; what should go here? 
    (ad-do-it))) 

(ad-activate 'dired-find-file) 

Ich weiß, ich konnte hart Code es Acrobat Reader zu starten, indem er die Position der EXE-Datei geben. Aber ich hätte lieber etwas, das weniger Suchen von mir erfordert und das nicht bricht, wenn Standardanwendungen sich verschieben/ändern. Was soll ich verwenden?

Antwort

6
  1. Bewerten Sie die folgenden elisp
  2. Run dired (Mx dired)
  3. Durchsuchen, um Verzeichnis und
  4. Mit Punkt auf Datei

  5. Datei, F3 drücken, wird die Datei öffnen, basierend auf der Windows-Erweiterung .

    (defun w32-browser (doc) (w32-shell-execute 1 doc))

    (eval-after-load "dired" '(define-key dired-mode-map [f3] (lambda() (interactive) (w32-browser (dired-replace-in-string "/" "\\" (dired-get-filename))))))

+0

Nicht scharf auf eval-nach-laden, aber +1 für w32-Shell ausführen - es ist eindeutig der richtige Weg, es zu tun. –

+1

"\" sollte "\\" sein – Yoo

3

Ich fand this terrific web page über Google, die mich zu einer Technik mit RunDll, die funktioniert. Ich stelle es hier auf, für den Fall, dass jemand anderes neugierig ist.

Hier ist der Schlüssel Stück Code, das filename mit der entsprechenden Anwendung öffnet:

(shell-command (concat "rundll32 shell32,ShellExec_RunDLL " (shell-quote-argument filename))) 

Und hier ist meine volle Lösung. (Beachten Sie, dass dired-find-file nur ein Wrapper um find-file ist, der den Dateinamen nicht kennt, so dass Sie find-file anstelle von dired-find-file wie in der Frage angeben müssen. Wenn Sie das Verhalten für find-file nicht möchten, müssen Sie wahrscheinlich dired-find-file neu schreiben oder schreiben kompliziertere Beratung.)

(defun open-externally (filename) 
    (shell-command (concat "rundll32 shell32,ShellExec_RunDLL " (shell-quote-argument filename)))) 

(defun is-file-type? (filename type) 
    (string= type (substring filename (- (length filename) (length type))))) 

(defun should-open-externally? (filename) 
    (let ((file-types '(".pdf" ".doc" ".xls"))) 
    (member t (mapcar #'(lambda (type) (is-file-type? filename type)) file-types)))) 

(defadvice find-file (around find-file-external-file-advice (filename &optional wildcards)) 
    "Open non-emacs files with an appropriate external program" 
    (if (should-open-externally? filename) 
     (open-externally filename) 
    ad-do-it)) 

(ad-activate 'find-file) 
0

Tom Smith Antwort schön ist, aber Sie können auch laufen nur das Programm „Start“ mit dem Dateinamen als Argument.

(shell-command (concat "start " (shell-quote-argument filename))) 
+1

Sind Sie sicher? Wenn ich das ausprobiert habe, funktioniert es nicht - ich bekomme nur ein leeres Eingabeaufforderungsfenster. –

+1

@Tom: Das ist sinnvoll, da das erste in Anführungszeichen gesetzte Argument für 'start' als Fenstertitel verwendet wird. – jamessan

3

Verwenden Dired+ dafür.

  • C-RET öffnet die Stromleitung der Datei mit seiner Windows-Datei-Assoziation Anwendung.

  • M-RET öffnet Windows Explorer auf die Datei oder den Ordner

  • ^, wenn sie in einem Stammverzeichnis (zB C:\), bewegt sich auf eine Dired artige Liste aller Windows-Laufwerke (lokal und entfernt).

0

org-open-file ist ein systemunabhängiger externer Öffner. Weitere Informationen zum Anpassen finden Sie unter org-file-apps.

8

auf dem 'org-open-Datei' Vorschlag erweitern:

(defun my-dired-find-file (&optional prefix) 
    (interactive "P") 
    (if prefix 
     (org-open-file (dired-get-file-for-visit) 'system) 
     (dired-find-file))) 

(define-key dired-mode-map "\r" 'my-dired-find-file) 

lassen Sie eine Datei extern mit `C-u RET‘ öffnen.

(setq dired-guess-shell-alist-user 
    (list 
    (list "\\.*$" "cmd /k") 
)) 

Dies öffnet die Datei cmd.exe verwendet, die mit der Dateierweiterung zugeordnet ist, was Programm verwenden:

bei http://lists.gnu.org/archive/html/bug-gnu-emacs/2012-11/msg01069.html

1

Ich habe dies in meinem .emacs gefunden. Getestet, um unter Windows 8 und GNU Emacs 24.2.1 zu arbeiten.

+0

Ich teste '' setq dired-guess-shell-alist-benutzer '((". *" (Concat "start" "\" "file" \ "")))) '' im Moment. (Ich habe Dateinamen mit Leerzeichen gefunden.) –

0

Ich würde (w32-shell-execute "open" file-name) verwenden.

In der Tat, in meiner Init-Datei Ich habe:

(defun open-externally (file-name) 
    (interactive "fOpen externally: ") 
    (let ((process-connection-type nil)) 
    (start-process "open-externally" nil 
        "xdg-open" file-name))) 

(when (eq window-system 'w32) 
    (defun open-externally (file-name) 
    (interactive "fOpen externally: ") 
    (w32-shell-execute "open" file-name))) 

Welche, dass ein Befehl definiert (verwendet interaktiv sein kann und) nach xdg-open eine Datei mit der Standardanwendung öffnet und dann, wenn ich eigentlich unter Windows, definiert diesen Befehl entsprechend neu.