Я нашел эту потрясающую веб-страницу через Google, что позволило мне использовать технику с использованием RunDll, которая работает. Я выкладываю это здесь на случай, если кому-то еще будет любопытно.
Вот ключевой фрагмент кода, который открывается filename
с помощью соответствующего приложения:
(shell-command (concat "rundll32 shell32,ShellExec_RunDLL " (shell-quote-argument filename)))
И вот мое полное решение. (Обратите внимание, что dired-find-file
- это просто оболочка find-file
, которая не знает имя файла, поэтому вам нужно указать find-file
, а не dired-find-file
, как в вопросе. Если вы не хотите, чтобы поведение для find-file
вам, вероятно, придется переписать dired-find-file
или написать более сложный совет.)
(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)