怎么实现在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 正式版后要开始收费了

1 个赞

现成的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 才能恢复。有选项关闭这个行为吗?

现在用 Emark,对于需要在 Emacs 中使用外部程序打开文件,有了更方便的方案。

比如 在 Dired 界面下,在需要用外部程序打开的文件上执行 embark-act, 我绑定了 C-.,然后按 x 就会用系统设定的默认程序打开相应的文件,非常方便,不需要特别的设置了。

Embark 确实是 Emacs 一大神器之一 :grinning:

2 个赞

用法上写点介绍呗,看着像不同对象有不同执行命令快速选择?

可以看看这篇文章 https://karthinks.com/software/fifteen-ways-to-use-embark/

我也是刚开始用 Emark,主要用的是两个命令: embark-actembark-dwim ,其他还在慢慢探索中。

  • embark-act 就是跟你想的一样,在不同对象上用,会弹出不同的命令菜单,类似于图形软件的右键弹出上下文菜单。这个主要用来解决知道了要执行的对象,但还不确定要执行什么命令的情况。命令是自动识别 Emacs 自带的命令,也可以自己定义。

  • embark-dwim 我用的还不多,主要是替代 xref-find-definitions',这个命令相当于图形软件的左键点击命令,点了自动会执行相应的动作。比如如果可以执行 `xref-find-definitions’,它就直接进行跳转了,不会有提示命令的。

这位大佬在视频的最后部分有介绍 https://www.youtube.com/watch?v=5ffb2at2d7w

1 个赞

看着扩展性很强大,但是最后用的功能就那几个,天天弹选择菜单反而效率低?

我现在确定的功能都是肌肉记忆,补全主要靠snails,记不住菜单靠one-key.el

请教下,不知道embark相对于我的使用习惯有额外的优势?