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

Ответ 1

  • Оцените следующий elisp
  • Запустить dired (M-x dired)
  • Поиск в каталоге и файле
  • С точкой в ​​файле нажатие 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))))))

Ответ 2

Чтобы расширить предложение "org-open-file":

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

Позволяет вам открывать файл снаружи с помощью `C-u RET '.

найдено http://lists.gnu.org/archive/html/bug-gnu-emacs/2012-11/msg01069.html

Ответ 3

Я нашел эту потрясающую веб-страницу через google, что позволило мне использовать технику с использованием RunDll. Я выражаю это здесь, если кому-то еще интересно.

Вот ключевая часть кода, которая открывает filename с помощью соответствующего приложения:

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

И вот мое полное решение. (Обратите внимание, что dired-find-file - это всего лишь обертка round 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)

Ответ 4

Используйте Dired + для этого.

  • C-RET открывает файл текущей строки, используя его приложение для объединения файлов Windows.

  • M-RET открывает проводник Windows в файл или папку

  • ^, когда в корневом каталоге (например, C:\) перемещается до списка Dired-like всех дисков Windows (локальных и удаленных).

Ответ 5

У меня это в моем .emacs:

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

Это откроет файл с помощью cmd.exe, который будет использовать любую программу, связанную с расширением файла. Протестировано для работы с Windows 8 и GNU Emacs 24.2.1.

Ответ 6

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

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

Ответ 7

org-open-file - независимый от системы внешний открыватель. Подробнее о том, как его настроить, см. org-file-apps.

Ответ 8

Я бы использовал (w32-shell-execute "open" file-name).

Фактически, в моем файле инициализации я:

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

Определяет команду, которая (может быть использована в интерактивном режиме) открывает файл с приложением по умолчанию в соответствии с xdg-open, а затем, если я действительно на Windows, переопределяет эту команду соответствующим образом.