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