2010-02-17 9 views
11

Estoy tratando de modificar la función dired-find-file en emacs en Windows XP para que cuando abra (diga) un archivo pdf de dired active una copia de Acrobat Reader y abra esa archivar con él, en lugar de abrirlo dentro de emacs. Pero no puedo averiguar qué variante usar en shell-command/call-process. Esto es lo que tengo hasta ahora:Apertura de archivos con la aplicación predeterminada de Windows desde 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) 

Sé que podría difícil que el código para iniciar Acrobat Reader, dándole la ubicación del archivo .exe. Pero prefiero tener algo que requiera menos búsqueda de mí y que no se rompa cuando las aplicaciones predeterminadas se muevan/cambien. ¿Qué debería usar?

Respuesta

6
  1. evaluar los siguientes elisp
  2. Run dired (Mx dired)
  3. Examinar para directorio y archivo
  4. Con el punto en el archivo, presionando F3 se abrirá el archivo basándose en la extensión ventanas .

    (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

No está interesado en eval-after-load, pero +1 para w32-shell-execute: es claramente la forma correcta de hacerlo. –

+1

"\" debería ser "\\" – Yoo

3

Encontré this terrific web page a través de google, lo que me permitió utilizar una técnica que utiliza RunDll. Lo estoy poniendo aquí en caso de que alguien más tenga curiosidad.

Aquí es la pieza clave del código, que se abre filename mediante la aplicación adecuada:

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

Y aquí está mi solución completa. (Tenga en cuenta que dired-find-file es solo un contenedor redondo find-file que no conoce el nombre del archivo, por lo que debe avisar find-file en lugar de dired-find-file como en la pregunta. Si no desea el comportamiento para find-file, probablemente necesite volver a escribir dired-find-file o escribir un asesoramiento más complicado.) la respuesta de

(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 es agradable, pero también se puede simplemente ejecutar el programa "Inicio" con el nombre de archivo como argumento.

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

¿Estás seguro? Cuando lo he intentado, no funciona; obtengo una ventana de símbolo del sistema vacía. –

+1

@Tom: Eso tiene sentido, ya que el primer argumento citado para 'start' se usa como el título de la ventana. – jamessan

3

Uso Dired+ para esto.

  • C-RET abre el archivo de la corriente de línea utilizando su aplicación de archivos de Windows asociación.

  • M-RET abre el Explorador de Windows para el archivo o carpeta

  • ^, cuando en un directorio raíz (por ejemplo C:\), se mueve hacia arriba a una lista Dired-como de todas las unidades de Windows (local y remoto).

0

org-open-file es un sistema de apertura externa independiente del sistema. Consulte org-file-apps para saber cómo personalizarlo aún más.

8

Extender sobre la propuesta 'org-abierta-archivo':

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

te permiten abrir un archivo externo con `C-u RET'.

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

1

tengo esto en mi .emacs:

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

Esto abrirá el archivo con cmd.exe que se utilice cualquier programa está asociado con la extensión de archivo. Probado para trabajar en Windows 8 y GNU Emacs 24.2.1.

+0

Estoy probando '(setq dired-guess-shell-alist-user '((". * "(Concat" start "" \ "" file "\" ")))) 'en este momento. (Encontré nombres de archivos con espacios). –

0

Yo usaría (w32-shell-execute "open" file-name).

De hecho, en mi archivo de inicio que tengo:

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

que define un comando que (se puede usar de forma interactiva y) se abre un archivo con la aplicación por defecto de acuerdo con xdg-open y luego, si estoy en realidad en Windows, redefine ese comando apropiadamente.

Cuestiones relacionadas