Я пытаюсь настроить dired-find-file
функция в emacs на Windows XP так, чтобы, когда я открываюсь (сказали), что файл PDF от сушеного это разжигает копию Acrobat Reader и открывает тот файл с ним, вместо того, чтобы открыть его в emacs. Но я не могу удаться что вариант на shell-command/call-process
использовать. Вот то, что я имею до сих пор:
(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)
Я знаю, что мог твердый код это для запуска Acrobat Reader путем предоставления ему местоположения .exe файла. Но у меня было бы что-то, что требует меньшего количества поиска от меня и которое не повредится, когда приложения по умолчанию переместятся/изменят. Что я должен использовать?
При наведении на файл, нажатие F3 откроет файл на основе расширения 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))))))
Ответ Тома Смита хорош, но вы также можете просто запустить программу «start» с именем файла в качестве аргумента.
(shell-command (concat "start " (shell-quote-argument filename)))
Я нашел эту потрясающую веб-страницу через Google, которая позволила мне найти технику с использованием RunDll, которая работает. Я выкладываю ее здесь на случай, если кому-то еще интересно.
Вот ключевой фрагмент кода, который открывает имя файла
с помощью соответствующего приложения:
(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)