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


10

M-x ewwпідкаже URL-адреса або ключові слова та відкриє новий *eww*буфер. В 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з не-електронного буфера. Якщо я перебуваю в електронному буфері, гак не спрацьовує, оскільки режим не змінюється. Принаймні, я думаю, що це відбувається.
RP Dillon

Ти правий. Те, що я розмістив, працює точно за призначенням, лише якщо ви робите 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 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

Оновлення

Таку поведінку обговорювали в помилці # 34374 та об’єднувались 02.02.2015 .

Так, у 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 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 (наприклад, з буфера режиму буфера або з діфрованих буферів, з нуля, ще один документ, будь-який) переносить мене до іншого буфера eww. Нарешті я Sпереходжу до списку буферів eww, щоб вибрати звідти. Як не дивно, але це працює, і з декількома кроками. Цікаво, чому eww-newне було вбудовано з самого початку. Звичайно, чистіше з кодом вище, я спробую це. Я радий бачити, що функція була додана в Emacs 26.


У Emacs 27 виклик ewwіз аргументом префікса тепер створює новий буфер EWW; дивіться мою відповідь вище.
Василь

Якщо ви не хочете вигадувати нове ім’я буфера, перейдіть з M-x rename-uniquely.
Стефан

Дякую Стефан за пораду. У мене Debian 9, і я поки що Emacs 27 :(
techapu

У будь-якому разі мені доведеться оновити свій Emacs, я весь час використовую вбудований браузер. І w3m порушує мій потік вкладками. Eww - це практично, і це все, що мені потрібно. Ця функція дійсно важлива, дякую Василю за оновлення, спеціальна команда, якою ви ділитеся, здається розумною альтернативою стандартній поведінці. Я постійно переходжу між файлами org, інформаційними буферами, терміналами та веб-переглядачем eww, і було б непогано мати eww під рукою, не закопуючи попередню сторінку.
течапу

@Stefan Проблема, яку я бачу з цим рішенням, полягає в тому, що мені потрібно знати, що в буфері, щоб я повертався пізніше туди. Яке було б унікальне перейменування?
течапу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.