使用emacs中的默认Windows应用程序打开文件

时间:2010-02-17 20:54:42

标签: windows emacs elisp

我正在尝试调整Windows XP上的emacs中的dired-find-file函数,这样当我打开(比方说)来自dired的pdf文件时,它会激活一份Acrobat Reader并用它打开该文件,而不是在emacs中打开它。但我无法确定shell-command/call-process上使用的变体。这是我到目前为止所做的:

(defadvice dired-find-file (around dired-find-file-external (filename &optional wildcards))
  "Open non-text files with an appropriate external program."
  (if (string= ".pdf" (substring filename (- (length filename) 4))) ; obviously I'll replace this with something more general/robust
    (shell-command filename) ;; what should go here?
    (ad-do-it)))

(ad-activate 'dired-find-file)

我知道我可以硬编码启动Acrobat Reader,方法是给它提供.exe文件的位置。但我宁愿有一些东西需要较少的搜索,当默认应用程序移动/更改时不会破坏。我该怎么用?

8 个答案:

答案 0 :(得分:8)

扩展'org-open-file'提案:

(defun my-dired-find-file (&optional prefix)
    (interactive "P")
    (if prefix
        (org-open-file (dired-get-file-for-visit) 'system)
      (dired-find-file)))

(define-key dired-mode-map "\r" 'my-dired-find-file)

将允许您使用`C-u RET'在外部打开文件。

发现于http://lists.gnu.org/archive/html/bug-gnu-emacs/2012-11/msg01069.html

答案 1 :(得分:7)

  1. 评估以下elisp
  2. Run dired(M-x dired)
  3. 浏览目录和文件
  4. 使用文件指针,按F3将根据Windows扩展名打开文件。

    (defun w32-browser (doc) (w32-shell-execute 1 doc))

    (eval-after-load "dired" '(define-key dired-mode-map [f3] (lambda () (interactive) (w32-browser (dired-replace-in-string "/" "\\" (dired-get-filename))))))

答案 2 :(得分:3)

我通过谷歌找到this terrific web page,让我使用RunDll的技术。我把它放在这里以防万一其他人好奇。

以下是关键代码,使用适当的应用程序打开filename

(shell-command (concat "rundll32 shell32,ShellExec_RunDLL " (shell-quote-argument filename)))

这是我的完整解决方案。 (请注意,dired-find-file只是一个不知道文件名的find-file包装器,因此您必须在问题中提示find-file而不是dired-find-file。如果你不想要find-file的行为,你可能需要重写dired-find-file或写更复杂的建议。)

(defun open-externally (filename)
  (shell-command (concat "rundll32 shell32,ShellExec_RunDLL " (shell-quote-argument filename))))

(defun is-file-type? (filename type)
  (string= type (substring filename (- (length filename) (length type)))))

(defun should-open-externally? (filename)
  (let ((file-types '(".pdf" ".doc" ".xls")))
    (member t (mapcar #'(lambda (type) (is-file-type? filename type)) file-types))))

(defadvice find-file (around find-file-external-file-advice (filename &optional wildcards))
  "Open non-emacs files with an appropriate external program"
  (if (should-open-externally? filename)
      (open-externally filename)
    ad-do-it))

(ad-activate 'find-file)

答案 3 :(得分:3)

使用Dired+以及w32-browser.el

  • C-RET 使用Windows文件关联应用程序打开当前行的文件。

  • M-RET 打开Windows资源管理器到文件或文件夹

  • ^ ,在根目录(例如C:\)中,向上移动到所有Windows驱动器(本地和远程)的类似Dired的列表。

前两个命令可从w32-browser.el获得。 (Dired +将它们绑定到那些键。)第三个命令来自Dired +。

答案 4 :(得分:1)

我的.emacs中有这个:

(setq dired-guess-shell-alist-user
  (list
    (list "\\.*$" "cmd /k")
  ))

这将使用cmd.exe打开文件,cmd.exe将使用与文件扩展名关联的任何程序。经过测试,适用于Windows 8和GNU Emacs 24.2.1。

答案 5 :(得分:1)

我使用(w32-shell-execute "open" file-name)

事实上,在我的init文件中,我有:

(defun open-externally (file-name)
  (interactive "fOpen externally: ")
  (let ((process-connection-type nil))
     (start-process "open-externally" nil
                    "xdg-open" file-name)))

(when (eq window-system 'w32)
  (defun open-externally (file-name)
    (interactive "fOpen externally: ")
    (w32-shell-execute "open" file-name)))

其中定义了一个命令(可以交互使用)根据xdg-open使用默认应用程序打开文件,然后,如果我实际在Windows上,则适当地重新定义该命令。

答案 6 :(得分:0)

Tom Smith的答案很好,但您也可以使用文件名作为参数运行程序“start”。

(shell-command (concat "start " (shell-quote-argument filename)))

答案 7 :(得分:0)

org-open-file是一个独立于系统的外部开启者。有关如何进一步自定义的信息,请参阅org-file-apps