Emacs和eww,在新窗口中打开链接?

时间:2015-02-11 15:59:11

标签: browser emacs elisp org-mode key-bindings

我将Emacs配置为在eww中打开新链接,如下所示:

 (setq browse-url-browser-function 'eww-browse-url)

现在当我点击一个链接时,它会在同一个缓冲区中打开。

我希望它打开一个新窗口(即垂直分割,如 C - x 3 )并在右侧新创建的框架中打开页面。所以我仍然在左边有原始的组织模式笔记。

[编辑]

我砍了一些东西。但它只有在我激活热键时才有效,而不是在另一个函数打开链接时。

理想情况下,我需要类似下面的内容,但每当我打开链接时(例如在helm-google中)。

(defun my/open-in-right-window ()
  "Open the selected link on the right window plane"
  (interactive)
  (delete-other-windows nil)
  (split-window-right nil)
  (other-window 1)
  (org-return nil)
)

(defun my/eww-quitAndSingleWin ()
  "Quit the current browser session and activate single window mode."
  (interactive)
  (quit-window nil)
  (delete-other-windows nil)
)

(defun my/eww-split-right ()
  "Splits the Window. Moves eww to the right and underlying content on the left."
  (interactive)
  (split-window-right nil)
  (quit-window nil)
  (other-window 1)
)

(global-set-key (kbd "H-r") 'my/open-in-right-window)    

(add-hook 'eww-mode-hook   ;no impact.
      (lambda ()
         (local-set-key (kbd "s") 'my/eww-split-right)
         (local-set-key (kbd "Q") 'my/eww-quitAndSingleWin)
   ))

它会杀死其他窗口,打开新窗口,切换到新窗口,然后按返回[配置为在我的配置中打开链接]。
然后在eww-mode a' Q' (大写)退出会话并杀死另一个窗口,以避免打开太多窗口。

这不是最优雅的解决方案。我对更好的想法持开放态度?

2 个答案:

答案 0 :(得分:3)

我有类似的问题,希望打开多个eww缓冲区并通过建议eww-render来做到这一点。您可以将代码放在那里以使其始终运行。

(defadvice eww-render (after set-eww-buffer-name activate)
  (rename-buffer (concat "*eww-" (or eww-current-title
                                     (if (string-match "://" eww-current-url)
                                         (substring eww-current-url (match-beginning 0))
                                       eww-current-url)) "*") t))

答案 1 :(得分:2)

虽然罗素的答案在过去可能是正确的,但eww-current-titleeww-current-url已被废弃,而支持名为eww-data的缓冲区本地plist。

当前的eww-implementation还包括在呈现缓冲区后需要插入的钩子,从而避免了像defadvice这样的“杂乱”的事情。

截至2015年8月和this Git-commit,以下elisp为我工作:

(defun my-set-eww-buffer-title ()
  (let* ((title  (plist-get eww-data :title))
         (url    (plist-get eww-data :url))
         (result (concat "*eww-" (or title
                              (if (string-match "://" url)
                                  (substring url (match-beginning 0))
                                url)) "*")))
    (rename-buffer result t)))

(add-hook 'eww-after-render-hook 'my-set-eww-buffer-title)

您也可以使用此挂钩添加所需的键绑定。