Подтвердить что ты не робот

Как открывать файлы из внешнего режима Emacs?

Я хочу открыть pdf с evince вместо режима DocView. Есть ли возможность открыть файл с помощью определенной команды типа "evince"?

4b9b3361

Ответ 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))) ))))