如何在Emacs缓冲区中同时打开多个URL?
我将Emacs编辑器与org模式和evil模式一起使用,主要用于文本处理和文档编制。通常会有一个主题,其中包含多个不同的网站URL 示例:我有一个关于如何安装Emacs的文本片段:如何在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
*** 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,默认情况下不会启用该机制,因此每次执行该函数时,都会从头开始解析缓冲区组织元素解析缓冲区
- 每次执行该功能时,都会在浏览器中打开新选项卡
访问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