Простой метод создания нескольких буферов Eww

10

M-x ewwзапрашивает URL или ключевые слова и открывает новый *eww*буфер. In eww-mode, Gсвязан с eww, который заменяет содержимое одного буфера eww.

Чтобы создать несколько буферов для разных веб-страниц, я прибегнул к созданию нового буфера, его настройке eww-modeвручную, а затем нажатию G(или M-x eww) для просмотра URL-адреса.

Я легко могу написать функцию, которая делает все это за меня, но я удивлен, что эта функция не просто встроена. Я просто скучаю по нему?

Р.П. Диллон
источник
Emacs 27 теперь добавляет поддержку для вызова ewwс префиксным аргументом; см. мой ответ ниже.
Василий

Ответы:

6

Вы правы, что ewwне создает автоматически новые буферы для вас. Но я использовал этот трюк с ergoemacs.org, и он отлично работает!

С ниже eval'ed, каждый раз , когда вы делаете 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из буфера не-www. Однако, если я нахожусь в буфере eww, ловушка не срабатывает, потому что режим не меняется. По крайней мере, я думаю, что это происходит.
RP Диллон
Вы правы. То, что я опубликовал, работает точно так, как задумано, только если вы делаете это M-x ewwиз буфера, не принадлежащего eww. Было неясно, намеревались ли вы создать новый буфер eww в буфере eww. Я обновлю решение, если что-нибудь придумаю. Я также на последней версии мастера.
Каушал Моди
Такое поведение в проектировании ewwфункции , как показано в исходном коде: (pop-to-buffer-same-window (if (eq major-mode 'eww-mode) (current-buffer) (get-buffer-create "*eww*"))).
Каушал Моди
@RPDillon Смотрите обновление с советами работает для вас.
Каушал Моди
Спасибо за обновления! Подход, использующий советы, похоже, не срабатывает, на самом деле. Я думаю, что более простой подход с использованием функции может подойти мне лучше всего.
RP Диллон
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

Обновить

Это поведение обсуждалось в ошибке # 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)))

Что это делает сначала вызвать interactiveSPEC из eww, который подсказки для URL - адресов или поиск терминов , как обычно. Затем он вызывает eww-open-in-new-bufferранее введенные URL-адреса или условия поиска в качестве единственного предлагаемого URI, чтобы команда не вызывала истерику.

Эта команда будет работать как внутри, так и без EWW-буферов, поэтому она может выступать в качестве замены по умолчанию eww-open-in-new-buffer, если вы предпочитаете:

(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 Диллона . Что делает его хорошим кандидатом для создания псевдонима (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. Наконец, я иду Sк списку буферов eww, чтобы выбрать оттуда. Странно, но это работает, и с несколькими шагами. Интересно, почему eww-newне было встроено с самого начала. Конечно, с приведенным выше кодом все будет чище, я попробую. Я рад видеть, что эта функция была добавлена ​​в Emacs 26.

techapu
источник
В Emacs 27 вызов ewwс аргументом префикса теперь создает новый буфер EWW; см. мой ответ выше.
Василий
Если вы не хотите изобретать новое имя буфера, переходите к M-x rename-uniquely.
Стефан
Спасибо Стефану за подсказку. У меня Debian 9 и я до сих пор в Emacs 27 :(
techapu
В любом случае мне придется обновить Emacs, я постоянно пользуюсь встроенным браузером. И w3m нарушает мой поток с помощью вкладок. Eww практично и это все что мне нужно. Эта функция действительно важна, спасибо Василию за обновление, пользовательская команда, которой вы делитесь, кажется разумной альтернативой стандартному поведению. Я постоянно перехожу между файлами org, информационными буферами, терминалами и браузером eww, и было бы неплохо иметь под рукой eww, не скрывая предыдущую страницу.
techapu
@Stefan проблема, которую я вижу с этим решением, состоит в том, что мне нужно знать, что находится в буфере, поэтому я вернусь туда позже. Что будет выводить переименовать однозначно?
techapu