Как я могу открывать файлы извне в режиме Emacs?
Я хочу открыть PDF с evince вместо режима DocView. Есть ли возможность открыть файл с помощью определенной команды, например "evince"?
8 ответов
Да. использование !
в то время как в dired запустить команду оболочки для файла.
В случае evince
умнее использовать &
тем не менее, который будет запускать команду асинхронно, поэтому emacs будет по-прежнему использоваться, пока у вас открыт PDF.
Существует более одного способа сделать это. Я предлагаю библиотеку OpenWith. Настройка для вашего случая может выглядеть так:
(add-to-list 'load-path "/path/to/downloaded/openwith.el")
(require 'openwith)
(setq openwith-associations '(("\\.pdf\\'" "evince" (file))))
(openwith-mode t)
Устанавливает обработчик файла, который будет работать с обоих dired
а также find-file
,
Попробуй это.
(defun dired-open-file ()
"In dired, open the file named on this line."
(interactive)
(let* ((file (dired-get-filename nil t)))
(message "Opening %s..." file)
(call-process "gnome-open" nil 0 nil file)
(message "Opening %s done" file)))
Ты можешь использовать !
чтобы открыть файл, а затем укажите команду.
Обратите внимание, что вы можете сохранить процесс после выхода из Emacs, используя nohup
[Википедия], так что поставьте точку на одном файле в dired
:
C-u ! nohup evince ? &
который создает постоянные процессы [EmacsWiki].
В Windows я использую! и команда "проводник", чтобы открыть PDF/Word/Excel...
Другое решение для ОС Windows, использующееexplorer.exe
открыть один/несколько файлов. Чтобы открыть несколько файлов, отметьте файл с помощьюm
вdired
а затем нажмите, чтобы открыть несколько файлов. Чтобы просто открыть один файл при нажатии точкиo
. Я тестировал его в графическом интерфейсе Emacs 28.2, работающем в Windows (без WSL/Cygwin/Linux-on-Windows).
(use-package dired
:bind (:map dired-mode-map
("o" . jr/dired-open))
:config
(defun jr/dired-open ()
(interactive)
(if-let ((marks (dired-get-marked-files)))
(dolist (file marks)
(shell-command (format "explorer.exe %s" (file-name-nondirectory file))))
(user-error "No marked files; aborting"))))
(defun dired-open()
(interactive)
(setq file (dired-get-file-for-visit))
(setq ext (file-name-extension file))
(cond ((string= ext "pdf")
;; shell-quote-argument escapes white spaces on the file name
(async-shell-command (concat "zathura " (shell-quote-argument file))))
((string= ext "epub")
(async-shell-command (concat "zathura " (shell-quote-argument file))))
((string= ext "rar")
(async-shell-command (concat "file-roller " (shell-quote-argument file))))
((string= ext "zip")
(async-shell-command (concat "file-roller " (shell-quote-argument file))))
(t (dired-find-file))))