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

问题描述 投票:12回答:8

我试图在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文件的位置。但我宁愿有一些东西需要较少的搜索,当默认应用程序移动/更改时不会破坏。我该怎么用?

windows emacs elisp
8个回答
7
投票
  1. 评估以下elisp
  2. 运行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))))))

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


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
投票

使用Dired+以及w32-browser.el

  • C-RET使用其Windows文件关联应用程序打开当前行的文件。
  • M-RET将Windows资源管理器打开到文件或文件夹
  • ^,当在根目录(例如C:\)中时,向上移动到所有Windows驱动器(本地和远程)的类似Dired的列表。

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


1
投票

我的.emacs中有这个:

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

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


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上,则适当地重新定义该命令。


0
投票

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

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

0
投票

qazxsw poi是一个独立于系统的外部开场白。请参阅qazxsw poi,了解如何进一步定制它。

© www.soinside.com 2019 - 2024. All rights reserved.