创建多个eww缓冲区的简单方法


10

M-x eww提示输入网址或关键字,并打开一个新的*eww*缓冲区。在中eww-modeG绑定到eww,它将替换单个eww缓冲区的内容。

为了为不同的网页创建多个缓冲区,我不得不创建一个新的缓冲区,eww-mode手动设置,然后按G(或M-x eww)访问URL。

我可以轻松地编写一个为我完成所有这些工作的函数,但是令我惊讶的是,该功能不仅仅是内置的。我只是想念它吗?


Emacs 27现在增加了对eww带有前缀参数的调用的支持。请参阅下面的答案。
罗勒

Answers:


6

您是正确的,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)

在Emacs 25中,这似乎对我不起作用(我是从大师那里构建的)。rename-uniquely不过,我确实使用进行了部分修复,如果我eww从非eww缓冲区激活,这将非常有效。但是,如果我在eww缓冲区中,则钩子不会触发,因为模式没有改变。至少我认为这是正在发生的事情。
RP Dillon

你是对的。仅当您M-x eww从非eww缓冲区执行操作时,我发布的内容才完全符合预期。目前尚不清楚您是否打算在eww缓冲区中生成新的eww缓冲区。如果有什么建议,我将更新解决方案。我也在使用最新版本的master。
Kaushal Modi

此行为是在设计eww用作在源代码中看出:(pop-to-buffer-same-window (if (eq major-mode 'eww-mode) (current-buffer) (get-buffer-create "*eww*")))
Kaushal Modi

@RPDillon请参阅更新,其中包含适用于您的建议。
Kaushal Modi

感谢更新!实际上,使用建议的方法似乎并不可行。我正在考虑使用函数的更简单方法可能最适合我。
RP Dillon

3

看来eww是为了避免这种行为而设计的。eww-new当需要新的eww缓冲区时,可以调用以下函数:

(defun eww-new ()
  (interactive)
  (let ((url (read-from-minibuffer "Enter URL or keywords: ")))
    (switch-to-buffer (generate-new-buffer "eww"))
    (eww-mode)
    (eww url)))

3

更新资料

此行为已在bug#34374中进行了讨论,并于2019-02-15合并。

因此,在Emacs 27中,eww使用带前缀参数的调用告诉它使用新的缓冲区,而不是重用默认*eww*缓冲区。


令我惊讶的是,该功能不仅是内置的。我只是想念它吗?

是的,没有。在Emacs 26中添加了类似的功能作为命令eww-open-in-new-bufferM-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-bufferRET将其全局绑定到更方便的键。


0

我扩展了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)
    )))

0

我使用Emacs 25.1,但eww-open-in-new-buffer功能不存在。因此,我必须重命名我所在的eww缓冲区,通常使用关于我所在页面的简单标题,然后eww从Emacs中打开的任何其他缓冲区中再次调用(例如,从缓冲区模式缓冲区或dired缓冲区,从头开始,另一个文档,任何)将我带到另一个eww缓冲区。最后,我转到Seww缓冲区列表中进行选择。奇怪的是,它可以工作,并且只需几个步骤。我想知道为什么eww-new从一开始就不是内置的。当然,上面的代码更加干净,我将尝试一下。我很高兴看到Emacs 26中添加了该功能。


在Emacs 27中,eww现在使用prefix参数进行调用会创建一个新的EWW缓冲区。请参阅上面的答案。
罗勒,

如果您不想发明一个新的缓冲区名称,请使用M-x rename-uniquely
Stefan

谢谢Stefan的提示。我有Debian 9,目前为止是Emacs 27 :(
techapu

无论如何,我都必须更新我的Emacs,我一直都在使用内置的浏览器。w3m的选项卡打破了我的流程。Eww很实用,这就是我所需要的。此功能非常重要,感谢Basil的更新,您共享的自定义命令似乎是标准行为的明智选择。我一直都在org文件,信息缓冲区,终端和eww浏览器之间浏览,并且手握eww而不会掩埋上一页会很好。
techapu

@Stefan我在该解决方案中遇到的问题是我需要知道缓冲区中的内容,因此稍后再返回。唯一重命名的输出是什么?
techapu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.