如何在Emacs缓冲区中同时打开多个URL?

如何在Emacs缓冲区中同时打开多个URL?,url,emacs,org-mode,Url,Emacs,Org Mode,我将Emacs编辑器与org模式和evil模式一起使用,主要用于文本处理和文档编制。通常会有一个主题,其中包含多个不同的网站URL 示例:我有一个关于如何安装Emacs的文本片段: *** install emacs emacs - I want to try org-mode. What's the shortest path from zero to typing? - Stack Overflow https://stackoverflow.com/questions/4940680/i

我将Emacs编辑器与org模式和evil模式一起使用,主要用于文本处理和文档编制。通常会有一个主题,其中包含多个不同的网站URL

示例:我有一个关于如何安装Emacs的文本片段:

*** install emacs

emacs - I want to try org-mode. What's the shortest path from zero to typing? - Stack Overflow
https://stackoverflow.com/questions/4940680/i-want-to-try-org-mode-whats-the-shortest-path-from-zero-to-typing

Index of /gnu/emacs/windows/emacs-26
http://ftp.gnu.org/gnu/emacs/windows/emacs-26/emacs-26.3-x86_64.zip

Installation target:
file://C:\Lupo_Pensuite\MyApps\emacs

How to
file://C:\Lupo_Pensuite\MyDocs\howto.txt
是否可以选择区域并在默认web浏览器中打开所有URL?Windows资源管理器正在打开文件链接吗?文本文件是否用关联的编辑器打开

或者更好:emacs知道上午的文本片段实际上是一个组织模式章节。不管光标在那一章的什么位置,像M-x打开章节中的所有链接……打开当前章节中提到的所有链接

Prio 1:emacs/org模式/邪恶模式中已经存在类似的东西了吗

Prio 2:您知道有一个elisp函数可以实现这个用例吗


环境:Windows 10下的Cygwin,emacs 26.3,组织模式9.1.9

警告:不用考虑,以下会让您的机器崩溃。我会在最后添加一些更具体的警告,但要小心

下面代码的基本思想是解析组织模式文件的缓冲区,以获得缓冲区的解析树:这是通过
Org element parse buffer
完成的。然后,我们可以使用
org-element-map
遍历解析树,只选择
link
类型的节点,并在执行时对每个节点应用一个函数。我们应用的函数,
get link
,遍历link节点的内容,提取类型和路径,并返回这两个节点的列表。以下是到目前为止的情况:

(取消获取链接(x)
(让*((链接(cadr x))
(类型(plist-get-link:type))
(路径(plist-get-link:path)))
(如果(或(字符串=类型“http”)(字符串=类型“https”))
(列表类型路径)))
(取消访问所有http链接()
(互动)
(let*((解析树(组织元素解析缓冲区))
(链接(组织元素映射解析树'link#'get-link'))
链接)
请注意,我只保留
http
https
链接:您可能需要添加额外的类型

这对你想要什么已经有很大的帮助了。事实上,如果您使用上述两个函数加载该文件,您可以在以下示例组织模式文件中尝试:

* foo
** foo 1
http://www.google.com
https://redhat.com
* bar
** bar 2
[[https://gnome.org][Gnome]] is a FLOSS project. So is Fedora: https://fedoraproject.org.


* Code
#+begin_src emacs-lisp :results value verbatim :wrap example
(visit-all-http-links)
#+end_src

#+RESULTS:
#+begin_example
(("http" "//www.google.com") ("https" "//redhat.com") ("https" "//gnome.org") ("https" "//fedoraproject.com"))
#+end_example

然后用
C-C-C
对源代码块进行评估,结果如下所示

现在,我们需要做的就是将结果列表中的每个
(键入路径)
对转换为真实的URL,然后访问它-以下是代码的最终版本:


(defun get-link (x)
  "Assuming x is a LINK node in an Org mode parse tree,
   return a list consisting of its type (e.g. \"http\")
   and its path."
  (let* ((link (cadr x))
         (type (plist-get link :type))
         (path (plist-get link :path)))
   (if (or (string= type "http") (string= type "https"))
     (list type path))))

(defun format-url (x)
  "Take a (TYPE PATH) list and return a proper URL. Note
   the following works for http- and https-type links, but
   might need modification for other types."
  (format "%s:%s" (nth 0 x) (nth 1 x)))

(defun visit-all-http-links ()
  (interactive)
  (let* ((parse-tree (org-element-parse-buffer))
         (links (org-element-map parse-tree 'link #'get-link)))
    (mapcar #'browse-url (mapcar #'format-url links))))
我们添加了一个函数
format url
,用于执行此操作:
(“http”“//example.com”)-->”http://example.com“
并将其映射到链接列表,生成新的URL列表。然后,我们将函数
browse url
(由emacs提供)映射到结果列表上,并观察浏览器将它们全部打开

警告:

  • 如果文件中有成百上千个链接,则将在浏览器中创建成百上千个选项卡。你确定你的机器能承受吗

  • 如果你的链接指向大对象,那将给你的系统带来另一种内存压力。你确定你的机器能承受吗

  • 如果您的组织模式缓冲区很大,那么
    组织元素解析缓冲区
    可能需要很长时间来处理它。此外,尽管存在缓存机制,但由于存在bug,默认情况下不会启用该机制,因此每次执行该函数时,都会从头开始解析缓冲区

  • 每次执行该功能时,都会在浏览器中打开新选项卡

编辑以回应评论中的问题:

Q1:“访问所有http链接打开文件中的所有URL。我最初的问题是,是否可以只打开当前组织模式章节中找到的URL。”

A1:如果你保证某个地区是语法正确的组织模式(例如,标题及其内容的集合),那么只做一个地区就有点困难,但也是可能的。您只需将区域写入临时缓冲区,然后执行我在临时缓冲区而不是原始缓冲区上所做的操作。 下面是使用问题2中的
访问url
功能修改的代码:

(取消访问区域中的所有http链接(结束)
(交互式“r”)
(let((s(缓冲子字符串beg end)))
(带临时缓冲器)
(设置缓冲区(当前缓冲区))
(插入s)
(let*((解析树(组织元素解析缓冲区))
(链接(组织元素映射解析树'link#'get-link'))
(mapcar#'访问-url(mapcar#'格式-url链接()("#)))
(取消访问所有http链接()
(互动)
(访问区域中的所有http链接(最小点)(最大点)))
非常容易测试

问题2:“每次我用示例URL执行函数时,URL都是以不同的顺序打开的——是否可以按照org文件中的顺序打开URL?”

A2:按照链接在文件中出现的顺序确定找到链接。但是,当您调用
浏览url
时,所有赌注都被取消,因为url现在属于浏览器,浏览器将尝试在单独的选项卡中使用单独的线程(换句话说,异步)打开收到的每个url。您可以尝试在呼叫之间引入延迟,但不能保证:

(defun visit-url(url)
   (browse-url)
   (sit-for 1 t))

然后在
访问所有url
中使用
访问url
而不是
浏览url

事实证明,组织模式已经内置了这种功能

今天我浏览了组织模式的文档,想知道C-C-o的工作原理。该组合键正在调用emacs组织模式函数“org open at point”。org open at point是打开游标所在的URL