4

外部アプリケーションを使用して PDF ファイルを開くように Emacs に指示するには、次のコードを使用します。

(require 'openwith)
'(openwith-associations (quote (("\\.skim\\'" "open" (file)) ("\\.pdf\\'" "open" (file)))))
(openwith-mode t)

PDF ファイルにアクセスすると、外部プログラムでファイルが正常に開かれますが、エラーとバックトレースも表示されます。

Debugger entered--Lisp error: (error "Opened Foundation - Isaac Asimov.pdf in external program")
  signal(error ("Opened Foundation - Isaac Asimov.pdf in external program"))
 error("Opened %s in external program" "Foundation - Isaac Asimov.pdf")
openwith-file-handler(insert-file-contents "/Users/jay/iBooks/Books/Foundation - Isaac Asimov.pdf" t nil nil nil)
insert-file-contents("~/iBooks/Books/Foundation - Isaac Asimov.pdf" t)
byte-code("\302\303  \302\"\210)\302\207" [inhibit-read-only filename t insert-file-contents] 3)
 find-file-noselect-1(#<killed buffer> "~/iBooks/Books/Foundation - Isaac Asimov.pdf" nil nil "~/Library/Containers/com.apple.BKAgentService/Data/Documents/iBooks/Books/Foundation - Isaac Asimov.pdf" (21490564 16777218))
find-file-noselect("/Users/jay/iBooks/Books/Foundation - Isaac Asimov.pdf" nil nil nil)
find-file("/Users/jay/iBooks/Books/Foundation - Isaac Asimov.pdf")
mapc(find-file ("/Users/jay/iBooks/Books/Foundation - Isaac Asimov.pdf"))
helm-find-many-files("/Users/jay/iBooks/Books/Foundation - Isaac Asimov.pdf")
apply(helm-find-many-files "/Users/jay/iBooks/Books/Foundation - Isaac Asimov.pdf")

エラーをスローせずに外部アプリケーションでファイルを開くにはどうすればよいですか?

4

2 に答える 2

2

外部アプリケーションでファイルを開くためstart-processに と組み合わせて使用​​することをお勧めします。dired-mode

Xah Lee は、OS に設定された外部の既定のアプリケーションでファイルを開く処理を行う、短いが効果的な関数を作成しました

(defun xah-open-in-external-app (&optional file)
  "Open the current file or dired marked files in external app.

The app is chosen from your OS's preference."
  (interactive)
  (let ( doIt
         (myFileList
          (cond
           ((string-equal major-mode "dired-mode") (dired-get-marked-files))
           ((not file) (list (buffer-file-name)))
           (file (list file)))))

    (setq doIt (if (<= (length myFileList) 5)
                   t
                 (y-or-n-p "Open more than 5 files? ") ) )

    (when doIt
      (cond
       ((string-equal system-type "windows-nt")
        (mapc (lambda (fPath) (w32-shell-execute "open" (replace-regexp-in-string "/" "\\" fPath t t)) ) myFileList))
       ((string-equal system-type "darwin")
        (mapc (lambda (fPath) (shell-command (format "open \"%s\"" fPath)) )  myFileList) )
       ((string-equal system-type "gnu/linux")
        (mapc (lambda (fPath) (let ((process-connection-type nil)) (start-process "" nil "xdg-open" fPath)) ) myFileList) ) ) ) ) )

私は似たようなもの (次の Github リンクで見ることができます) を使用していますが、Xah​​ Lee によって書かれた関数ほど単純ではありません: https://github.com/lawlist/dired-read-file-name/blob /master/dired-read-file-name.el

于 2014-08-04T18:04:05.033 に答える
0

ファイルへのパスがバッファにある場合は、それを保存してM-wから呼び出しshell-commandて呼び出しますxdg-open C-y。これにより、以前に保存したファイルへのパスがヤンクされ、関連するプログラムで開かれます。xdg-openそのファイルを開くための適切なプログラムを見つけます (スクリーンショット)。

于 2021-04-21T08:15:28.060 に答える