我正在尝试调整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文件的位置。但我宁愿有一些东西需要较少的搜索,当默认应用程序移动/更改时不会破坏。我该怎么用?
答案 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)
使用文件指针,按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)
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)
(shell-command (concat "start " (shell-quote-argument filename)))
答案 7 :(得分:0)
org-open-file
是一个独立于系统的外部开启者。有关如何进一步自定义的信息,请参阅org-file-apps
。