2010-02-17 12 views
11

che sto cercando di modificare la funzione dired-find-file in Emacs su Windows XP in modo che quando apro (ad esempio) un file pdf da dired spara una copia di Acrobat Reader e si apre quella file con esso, invece di aprirlo in emacs. Ma non riesco a capire che cosa variante shell-command/call-process da utilizzare. Ecco quello che ho finora:Apertura di file con l'applicazione predefinita di Windows dall'interno di 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) 

So che potrei hard-code per avviare Acrobat Reader dandogli la posizione del file exe. Ma preferisco avere qualcosa che richiede meno ricerche da me e che non si interromperà quando le applicazioni predefinite si spostano/cambiano. Cosa dovrei usare?

risposta

6
  1. valutare i seguenti elisp
  2. Run dired (Mx dired)
  3. Sfoglia per directory e file
  4. Con punto di file, premere F3 aprirà il file in base alla estensione di Windows .

    (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

Non appassionato di eval-after-load, ma +1 per w32-shell-execute - è chiaramente il modo giusto per farlo. –

+1

"\" dovrebbe essere "\\" – Yoo

3

ho trovato this terrific web page tramite Google, che mi ha lasciato a una tecnica utilizzando Rundll che funziona. Lo sto mettendo qui nel caso in cui qualcun altro sia curioso.

Ecco il pezzo chiave di codice, che apre filename utilizzando l'applicazione appropriata:

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

Ed ecco la mia soluzione completa. (Si noti che dired-find-file è solo un wrapper round find-file che non conosce il nome file, quindi è necessario avvisare find-file anziché dired-find-file come nella domanda.Se non si desidera il comportamento per find-file sarà necessario riscrivere dired-find-file o scrivere consiglio più complicato.) la risposta di

(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 è bello, ma si può anche solo eseguire il programma di "start" con il nome del file come argomento.

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

Sei sicuro? Quando ho provato questo non funziona - ho solo una finestra vuota del prompt dei comandi. –

+1

@Tom: questo ha senso, poiché il primo argomento quotato a 'start' viene utilizzato come titolo della finestra. – jamessan

3

Usa Dired+ per questo.

  • C-RET apre il file della corrente-line utilizzando l'applicazione di file-associazione di Windows.

  • M-RET apre Windows Explorer per il file o la cartella

  • ^, quando in una directory principale (ad esempio C:\), si muove fino a un elenco Dired-come di tutte le unità di Windows (locale e remoto).

0

org-open-file è un apri esterno indipendente dal sistema. Vedere org-file-apps per come personalizzarlo ulteriormente.

8

Per estendere in merito alla proposta 'org-open-file':

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

vi permetterà di aprire un file esterno con `C-u RET'.

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

1

ho questo nel mio .emacs:

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

Ciò aprirà il file utilizzando cmd.exe, che utilizzerà qualsiasi programma associato con l'estensione del file. Testato per funzionare su Windows 8 e GNU Emacs 24.2.1.

+0

Sto testando '(setq dired-guess-shell-alist-user '((". * "(Concat" start "" \ "" file "\" ")))) 'al momento. (Ho incontrato nomi di file con spazi.) –

0

Vorrei usare (w32-shell-execute "open" file-name).

Infatti, nel mio file init ho:

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

che definisce un comando che (può essere usato in modo interattivo e) si apre un file con l'applicazione predefinita in base alle xdg-open e poi, se sono in realtà su Windows, ridefinisce il comando in modo appropriato.

Problemi correlati