Вводные файлы с Приложением Windows по умолчанию из emacs

Я пытаюсь настроить 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 файла. Но у меня было бы что-то, что требует меньшего количества поиска от меня и которое не повредится, когда приложения по умолчанию переместятся/изменят. Что я должен использовать?

12
задан Tom Smith 17 February 2010 в 20:54
поделиться

3 ответа

  1. Оцените следующий elisp
  2. Запустите dired (M-x dired)
  3. Перейдите в каталог и файл
  4. При наведении на файл, нажатие 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))))))

7
ответ дан 2 December 2019 в 06:26
поделиться

Ответ Тома Смита хорош, но вы также можете просто запустить программу «start» с именем файла в качестве аргумента.

(shell-command (concat "start " (shell-quote-argument filename)))
0
ответ дан 2 December 2019 в 06:26
поделиться

Я нашел эту потрясающую веб-страницу через 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)
3
ответ дан 2 December 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: