Как я могу открывать файлы извне в режиме 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))))
Другие вопросы по тегам