Opening files with default Windows application from within emacs

前端 未结 8 1773
难免孤独
难免孤独 2021-02-07 21:06

I\'m trying to tweak the dired-find-file function in emacs on Windows XP so that when I open (say) a pdf file from dired it fires up a copy of Acrobat Reader and op

8条回答
  •  情书的邮戳
    2021-02-07 21:38

    I found this terrific web page via google, which let me to a technique using RunDll that works. I'm putting it up here in case anyone else is curious.

    Here is the key piece of code, which opens filename using the appropriate application:

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

    And here is my full solution. (Note that dired-find-file is just a wrapper round find-file which doesn't know the filename, so that you have to advise find-file rather than dired-find-file as in the question. If you don't want the behaviour for find-file you will probably need to rewrite dired-find-file or write more complicated advice.)

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

提交回复
热议问题