Открытие файлов с приложением Windows по умолчанию из Emacs - PullRequest
12 голосов
/ 17 февраля 2010

Я пытаюсь настроить функцию dired-find-file в emacs в Windows XP, чтобы при открытии (скажем) файла pdf из dired он запускал копию 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.Но я бы предпочел иметь что-то, что требует от меня меньше поиска и которое не сломается при перемещении / изменении приложений по умолчанию.Что я должен использовать?

Ответы [ 8 ]

8 голосов
/ 14 декабря 2012

Чтобы расширить предложение "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

7 голосов
/ 18 февраля 2010
  1. Оцените следующее значение
  2. Run 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))))))

3 голосов
/ 22 августа 2011

Используйте для этого Dired + вместе с w32-browser.el

  • C-RET открывает файл текущей строки с помощью приложения для сопоставления файлов Windows.

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

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

Команды для первых двух доступны с w32-browser.el. (Dired + связывает их с этими ключами.) Команда для третьего из Dired +.

3 голосов
/ 18 февраля 2010

Я нашел эту потрясающую веб-страницу через 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)
1 голос
/ 21 ноября 2015

Я бы использовал (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, переопределяет эту команду соответствующим образом.

1 голос
/ 31 марта 2013

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

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

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

0 голосов
/ 30 января 2012

org-open-file - независимый от системы внешний нож.См. org-file-apps для дальнейшей настройки.

0 голосов
/ 18 февраля 2010

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

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