Открытие файлов с помощью приложения Windows по умолчанию из emacs

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


person Tom Smith    schedule 17.02.2010    source источник


Ответы (8)


  1. Оцените следующий elisp
  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))))))

person user275761    schedule 18.02.2010
comment
Не в восторге от eval-after-load, но +1 для w32-shell-execute - это явно правильный способ сделать это. - person Tom Smith; 18.02.2010
comment
Почему он говорит Defining kbd macro..., когда я нажимаю «F3» - person ZhaoGang; 02.04.2019

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

person Jorge-León    schedule 14.12.2012

Я нашел эту потрясающую веб-страницу через 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)
person Tom Smith    schedule 17.02.2010

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

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

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

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

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

person Drew    schedule 21.08.2011
comment
Но минибуфер говорит the M-Ret is not defined - person ZhaoGang; 02.04.2019
comment
@ZhaoGang: Спасибо. Исправленный. Забыл, что первые две команды определены в w32-browser.el. - person Drew; 02.04.2019

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

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

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

person Lars Thorup    schedule 30.03.2013
comment
Я сейчас тестирую (setq dired-guess-shell-alist-user '((".*" (concat "start " "\"" file "\"")))). (Я встречал имена файлов с пробелами.) - person Brady Trainor; 28.04.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, соответствующим образом переопределяет эту команду.

person Omar Antolín-Camarena    schedule 20.11.2015

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

(shell-command (concat "start " (shell-quote-argument filename)))
person Matthew Talbert    schedule 18.02.2010
comment
Вы уверены? Когда я попробовал это, это не сработало - я просто получил пустое окно командной строки. - person Tom Smith; 18.02.2010
comment
@Tom: Это имеет смысл, поскольку первый аргумент start в кавычках используется в качестве заголовка окна. - person jamessan; 18.02.2010

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

person VitoshKa    schedule 30.01.2012