怎么实现在emacs里点击文件,用外部的程序将其打开

举个例子,如果我在emacs里面点击md文件,用外部的typora进行打开。

spacemacs 中有

(spacemacs/open-file-or-directory-in-external-app ARG)

可以用外部程序打开当前文件,或者 dired 光标下的文件,你可以看看他的代码,用了什么方法

我不用spacemacs,弄起来估计费劲。

(defun spacemacs//open-in-external-app (file-path)
  "Open `file-path' in external application."
  (cond
   ((spacemacs/system-is-mswindows)
    (w32-shell-execute "open" (replace-regexp-in-string "/" "\\\\" file-path)))
   ((spacemacs/system-is-mac) (shell-command (format "open \"%s\"" file-path)))
   ((spacemacs/system-is-linux) (let ((process-connection-type nil))
                                  (start-process "" nil "xdg-open" file-path)))))

(defun spacemacs/open-file-or-directory-in-external-app (arg)
  "Open current file in external application.
If the universal prefix argument is used then open the folder
containing the current file by the default explorer."
  (interactive "P")
  (if arg
      (spacemacs//open-in-external-app (expand-file-name default-directory))
    (let ((file-path (if (derived-mode-p 'dired-mode)
                         (dired-get-file-for-visit)
                       buffer-file-name)))
      (if file-path
          (spacemacs//open-in-external-app file-path)
        (message "No file associated to this buffer.")))))

我看了一下, 主要就是获取文件/文件夹路径,判断是否存在,如果存在,windows/macOS 就用 open 打开这个路径,linux 就用 xdg-open 打开这个路径,自己写一个应该也不麻烦

嗯嗯,谢谢,我看看 我刚才试了,这个不是我要的效果啊!如果是find-file,它必须要先用emacs自带的模式进入文件,然后调用这个函数,才能实现外部程序打开文件。如果是dired-mode倒是可以直接打开

发现有个openwith的包可以用哦,我改一下源码算了。

这里有现成的梯子。http://ergoemacs.org/emacs/emacs_dired_open_file_in_ext_apps.html

2赞

xdg-open 就可以了啊

linux我不用外部程序的,我找的是windows下的

mac: open

linux: xdg-open

win: 参考一下这个这个

感谢分享。这个用在Windows 上配合 Typora 预览 Markdown,配合SumatraPDF 看PDF文件,真的太舒服了。最好再配合一个全局的Emacs 按键 ,赞 :+1:
可惜Typora 正式版后要开始收费了

现成的elpa包:open-with,你值得拥有

尝试了一下你说的这个openwith, 这个包只是绑定指定的后缀通过外部程序打开,对于只是希望打开pdf,音乐,视频 等格式的需求是很合适的,和Emacs 集成的很好。但是好像没法同时通过emacs 和 opera 打开 markdown 文件,还是需要什么设置?。

如果只是markdown,很简单啊,markdown-mode专门有个函数,是让你设置外部程序预览的,比如,我用的是marked2.app (你想用typora就设typora打开,可以建个小script借助Windows下类似于linux xdg-open或mac open的命令转下,如果没提供直接的终端接口)

(setq markdown-open-command "/Users/XXX/bin/Marked2")

如果你想在浏览器中打开,你开个浏览器,用那些实时预览mode就好了啊(markdown-mode自带的不能实时,但用预览命令就是打开到你的浏览器啊;当然它还提供了个emacs内部预览的方式)。

:+1: 多谢,还不知道有这个命令,好用。不过通过 markdown-open 在typera 打开当前的markdown文件后,emacs的buffer就冻结了,需要多次 C-g 才能恢复。有选项关闭这个行为吗?