Answers:
您是正确的,eww
不会自动为您创建新的缓冲区。但是我一直在使用ergoemacs.org的技巧,效果很好!
进行以下评估后,每次M-x eww
从非eww缓冲区执行操作时,都会创建一个唯一的eww缓冲区。
;; Auto-rename new eww buffers
(defun xah-rename-eww-hook ()
"Rename eww browser's buffer so sites open in new page."
(rename-buffer "eww" t))
(add-hook 'eww-mode-hook #'xah-rename-eww-hook)
如果您想在eww缓冲区中生成新的eww缓冲区,请评估以下建议(您仍然需要评估以上建议,以便为新eww
缓冲区分配唯一的名称)。
;; C-u M-x eww will force a new eww buffer
(defun modi/force-new-eww-buffer (orig-fun &rest args)
"When prefix argument is used, a new eww buffer will be created,
regardless of whether the current buffer is in `eww-mode'."
(if current-prefix-arg
(with-temp-buffer
(apply orig-fun args))
(apply orig-fun args)))
(advice-add 'eww :around #'modi/force-new-eww-buffer)
rename-uniquely
不过,我确实使用进行了部分修复,如果我eww
从非eww缓冲区激活,这将非常有效。但是,如果我在eww缓冲区中,则钩子不会触发,因为模式没有改变。至少我认为这是正在发生的事情。
M-x eww
从非eww缓冲区执行操作时,我发布的内容才完全符合预期。目前尚不清楚您是否打算在eww缓冲区中生成新的eww缓冲区。如果有什么建议,我将更新解决方案。我也在使用最新版本的master。
eww
用作在源代码中看出:(pop-to-buffer-same-window (if (eq major-mode 'eww-mode) (current-buffer) (get-buffer-create "*eww*")))
。
更新资料
此行为已在bug#34374中进行了讨论,并于2019-02-15合并。
因此,在Emacs 27中,eww
使用带前缀参数的调用告诉它使用新的缓冲区,而不是重用默认*eww*
缓冲区。
令我惊讶的是,该功能不仅是内置的。我只是想念它吗?
是的,没有。在Emacs 26中添加了类似的功能作为命令eww-open-in-new-buffer
,M-RET默认情况下,该功能已绑定到EWW缓冲区中:
eww-open-in-new-buffer is an interactive compiled Lisp function in
‘eww.el’.
It is bound to M-RET, <menu-bar> <Eww> <Follow URL in new buffer>.
(eww-open-in-new-buffer)
Fetch link at point in a new EWW buffer.
唯一的问题是,在编写本文时,此命令仅限于仅在EWW缓冲区中使用。尤其是,user-error
如果在该点上没有找到有意义的链接(根据用户选项确定),则会引发eww-suggest-uris
:
eww-suggest-uris is a variable defined in ‘eww.el’.
Its value is
(eww-links-at-point url-get-url-at-point eww-current-url)
Documentation:
List of functions called to form the list of default URIs for ‘eww’.
Each of the elements is a function returning either a string or a list
of strings. The results will be joined into a single list with
duplicate entries (if any) removed.
You can customize this variable.
This variable was introduced, or its default value was changed, in
version 25.1 of Emacs.
该命令的另一个限制是它不会像命令那样提示用户输入URL或搜索词eww
。
这是一个简单的示例,说明如何弥合eww
和之间的这些差异eww-open-in-new-buffer
:
(defun my-eww-new-buffer (url)
"Like `eww', but fetch URL in a new EWW buffer."
(interactive (advice-eval-interactive-spec (cadr (interactive-form 'eww))))
(let ((eww-suggest-uris (list (lambda () url))))
(eww-open-in-new-buffer)))
这样做是第一次调用interactive
规范的eww
,它提示的网址或搜索条件如常。然后eww-open-in-new-buffer
,它将使用先前输入的URL或搜索词作为唯一建议的URI 进行调用,以便该命令不会发脾气。
该命令将在EWW缓冲区内和没有EWW缓冲区时都可以使用,因此eww-open-in-new-buffer
,如果您愿意,它可以代替default ,从而:
(with-eval-after-load 'eww
(define-key eww-mode-map [remap eww-open-in-new-buffer] #'my-eww-new-buffer))
无论哪种方式,您都可以从任何地方调用它,也可以M-xmy-eww-new-buffer
RET将其全局绑定到更方便的键。
我扩展了RP Dillon片段。这是创建别名之类的不错的选择,(defalias 'w #'af/eww)
并使用下面的函数打开eww。唯一的区别是有条件检查*eww*
缓冲区是否已经存在,然后创建新缓冲区,如果没有,eww
则调用本地缓冲区。
(defun af/eww ()
(interactive)
(let ((eww-current-buffer (get-buffer "*eww*"))
(url nil))
(if (eq eww-current-buffer nil)
(eww)
(setq url (read-from-minibuffer "Enter URL or keywords: "))
(switch-to-buffer (generate-new-buffer "eww"))
(eww-mode)
(eww url)
)))
我使用Emacs 25.1,但eww-open-in-new-buffer
功能不存在。因此,我必须重命名我所在的eww缓冲区,通常使用关于我所在页面的简单标题,然后eww
从Emacs中打开的任何其他缓冲区中再次调用(例如,从缓冲区模式缓冲区或dired缓冲区,从头开始,另一个文档,任何)将我带到另一个eww缓冲区。最后,我转到S
eww缓冲区列表中进行选择。奇怪的是,它可以工作,并且只需几个步骤。我想知道为什么eww-new
从一开始就不是内置的。当然,上面的代码更加干净,我将尝试一下。我很高兴看到Emacs 26中添加了该功能。
eww
现在使用prefix参数进行调用会创建一个新的EWW缓冲区。请参阅上面的答案。
M-x rename-uniquely
。
eww
带有前缀参数的调用的支持。请参阅下面的答案。