Я хочу открыть pdf с evince вместо режима DocView. Есть ли возможность открыть файл с помощью определенной команды типа "evince"?
Как открывать файлы из внешнего режима Emacs?
Ответ 1
Да. Используйте !
, в то время как в режиме ожидания, чтобы запустить команду оболочки в файле.
В случае evince
, умнее использовать &
, хотя, который будет запускать команду асинхронно, поэтому emacs все равно будет использоваться, пока вы открываете PDF.
Ответ 2
Существует более одного способа сделать это. Я предлагаю 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
.
Ответ 3
Попробуйте это.
(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)))
Ответ 4
Вы можете использовать !
, чтобы открыть файл, а затем указать команду.
Ответ 5
Обратите внимание, что вы можете сохранить процесс в живых после выхода из Emacs, используя nohup
[Wikipedia], поэтому поместите точку в один файл в dired
:
C-u ! nohup evince ? &
который создает Persistent Processes [EmacsWiki].
Ответ 6
В Windows я пользуюсь! и команду "explorer", чтобы открыть PDF/Word/Excel...
Ответ 7
Здесь открыто любое внешнее приложение из dired-mode в поле OSX
, используя ярлык клавиатуры C-c o
, когда курсор находится в строке с файлом, который пользователь хочет открыть с помощью внешнего приложения - второй загруженный буфер открывается в папку /Applications
, а клавиша ввода выбирает внешнее приложение. [Выбор нескольких файлов выходит за рамки этого ответа, однако я включил определение для dired-get-marked-files
на всякий случай, если кого-то интересует. Я также включил возможность открыть внешнее приложение в качестве альтернативы использованию чего-то вроде Finder.app или Dock.app или Spotlight - из /Applications
папки в dired, клавиша RET
предложит пользователю выбор либо открыть приложение извне, либо войти в папку упакованного приложения.]
Второй способ - использовать что-то вроде (equal (file-name-extension input-filename) ".pdf"))
для настройки условий и использовать start-process . . .
для активации определенного внешнего приложения для открытия выбранного файла - например, (start-process "pdf-with-skim" nil "open" "-a" "/Applications/Skim.app/Contents/MacOS/Skim" input-filename)
. Это можно сделать достаточно подробно с помощью суб-выбора (например, Adobe, Skim или Preview), а также можно использовать функцию string-match
или множество расширений файлов. Этот второй подход больше ориентирован на личные предпочтения пользователя, основанные на определенных программах, которые установлены, тогда как первый вариант (ниже) можно использовать для доступа к любому установленному внешнему приложению.
(require 'dired)
(defun dired-read-file-name (&optional directory)
(if directory
(dired directory)
(dired nil))
(let (output-filename)
(recursive-edit)
output-filename))
;; Open with external application.
(defvar open-with-variable nil)
(define-key dired-mode-map (kbd "C-c o") (lambda () (interactive)
(setq open-with-variable t)
(let* (
(lawlist-filename (dired-get-file-for-visit))
(application (dired-read-file-name "/Applications")))
(start-process "external" nil "open" "-a" application lawlist-filename)
(setq open-with-variable nil))))
;; select file or directory.
(define-key dired-mode-map (kbd "<return>") (lambda () (interactive)
(let* (
(input-filename
(if (or (re-search-backward "^*" nil t)
(re-search-forward "^*" nil t))
(dired-get-marked-files)
(dired-get-file-for-visit)))
(dired-buffer-name (buffer-name)))
(cond
;; open file
((and (not (file-directory-p input-filename))
(file-exists-p input-filename)
(not (equal input-filename (concat (file-name-directory input-filename) ".")))
(not open-with-variable))
(kill-buffer dired-buffer-name)
(find-file input-filename))
;; open with external application
((and (file-directory-p input-filename)
(not (equal input-filename (concat (file-name-directory input-filename) ".")))
open-with-variable
(equal (file-name-extension input-filename) "app"))
(setq output-filename input-filename)
(kill-buffer dired-buffer-name)
(throw 'exit nil))
;; Enter the directory; or, open an application
((and (file-directory-p input-filename)
(not (equal input-filename (concat (file-name-directory input-filename) "."))))
(if (equal (file-name-extension input-filename) "app")
(progn
(message "[o]pen %s" (file-name-nondirectory input-filename))
(let* ((open-or-enter (read-char-exclusive)))
(cond
((eq open-or-enter ?o)
(start-process "application" nil "open" "-a" input-filename)
(kill-buffer dired-buffer-name))
(t
(dired-find-file)
(goto-char (point-min))
(re-search-forward " \\.\\.$" nil t)
(kill-buffer dired-buffer-name)) )))
(dired-find-file)
(goto-char (point-min))
(re-search-forward " \\.\\.$" nil t)
(kill-buffer dired-buffer-name))) ))))