Método simple para crear múltiples buffers eww

10

M-x ewwsolicita url o palabras clave y abre un nuevo *eww*búfer. En eww-mode, Gestá vinculado a eww, que reemplaza el contenido del único búfer eww.

Para crear múltiples buffers para diferentes páginas web, he recurrido a la creación de un nuevo buffer, configurando eww-modemanualmente, luego presionando G(o M-x eww) para visitar una URL.

Puedo escribir fácilmente una función que hace todo esto por mí, pero me sorprende que esta funcionalidad no solo esté integrada. ¿Me lo estoy perdiendo?

RP Dillon
fuente
Emacs 27 ahora agrega soporte para llamar ewwcon un argumento prefijo; mira mi respuesta a continuación.
Basil

Respuestas:

6

Tienes razón, eso ewwno crea automáticamente nuevos buffers para ti. ¡Pero he estado usando este truco de ergoemacs.org y funciona muy bien!

Con la siguiente evaluación, cada vez que lo haga M-x ewwdesde un búfer que no sea eww , se creará un búfer eww único.

;; 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)

Si desea generar un nuevo búfer de eww mientras se encuentra en un búfer de eww, evalúe los siguientes consejos (aún deberá evaluar lo anterior para que ewwse asignen nombres únicos a los nuevos buffers).

;; 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)
Kaushal Modi
fuente
Esto no parece funcionar para mí en Emacs 25 (estoy construyendo desde master). Sin embargo, obtuve una solución parcial usando rename-uniquely, lo que es efectivo si activo ewwdesde un búfer que no es eww. Sin embargo, si estoy en un búfer eww, el gancho no se dispara, porque el modo no está cambiando. Al menos creo que eso es lo que está sucediendo.
RP Dillon
Tienes razón. Lo que publiqué funciona exactamente según lo previsto solo si lo haces M-x ewwdesde un búfer que no es eww. No estaba claro si tenía la intención de generar un nuevo búfer eww mientras estaba en un búfer eww. Actualizaré la solución si se me ocurre algo. También estoy en la última versión de master.
Kaushal Modi
Este comportamiento es en el diseño de la ewwfunción como se ve en el código fuente: (pop-to-buffer-same-window (if (eq major-mode 'eww-mode) (current-buffer) (get-buffer-create "*eww*"))).
Kaushal Modi
@RPDillon Vea que la actualización con el consejo funciona para usted.
Kaushal Modi
¡Gracias por la actualización! El enfoque que usa el consejo no parece dispararse, en realidad. Estoy pensando que un enfoque más simple usando una función podría ser mejor para mí.
RP Dillon
3

Parece que ewwestá diseñado para evitar este comportamiento. Esta función, eww-newse puede invocar cuando se desea un nuevo búfer 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)))
RP Dillon
fuente
3

Actualizar

Este comportamiento se discutió en el error # 34374 y se fusionó el 15/02/2019 .

Entonces, en Emacs 27, llamar ewwcon un argumento de prefijo le dice que use un nuevo búfer en lugar de reutilizar el *eww*búfer predeterminado .


Me sorprende que esta funcionalidad no sea solo incorporada. ¿Me lo estoy perdiendo?

Si y no. Se agregó una funcionalidad similar en Emacs 26 como el comando eww-open-in-new-buffer, que está vinculado a los M-RETbúferes EWW de forma predeterminada:

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.

El único problema es que, al momento de escribir, este comando se limita a trabajar solo en buffers EWW. En particular, arroja un user-errorenlace si no se encuentra un enlace significativo en el punto, según lo determinado por la opción del usuario 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.

Una limitación adicional del comando es que no solicita al usuario una URL o términos de búsqueda, como lo ewwharía el comando .

Aquí hay un ejemplo simple de cómo podría salvar estas diferencias entre ewwy 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)))

Lo que esto hace es primero llamar a la interactiveespecificación de eww, que solicita URL o términos de búsqueda como de costumbre. Luego llama eww-open-in-new-buffercon las URL de entrada o los términos de búsqueda previamente ingresados ​​como el único URI sugerido, para que el comando no haga berrinche.

Este comando funcionará tanto dentro como fuera de los buffers EWW, por lo que puede actuar como un reemplazo directo para el valor predeterminado eww-open-in-new-buffer, si lo prefiere:

(with-eval-after-load 'eww
  (define-key eww-mode-map [remap eww-open-in-new-buffer] #'my-eww-new-buffer))

De cualquier manera, puede invocarlo desde cualquier lugar M-xmy-eww-new-bufferRETo vincularlo globalmente a una tecla más conveniente.

Albahaca
fuente
0

Extendí un poco el fragmento RP Dillon . Lo que lo hace un buen candidato para crear alias como (defalias 'w #'af/eww)y abrir eww usando la función a continuación. La única diferencia es la verificación condicional si el *eww*búfer ya existe, luego se crea uno nuevo, si no ewwse invoca el nativo .

(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)
    )))
Adam Faryna
fuente
0

Yo uso Emacs 25.1 y la eww-open-in-new-bufferfunción no está allí. Así que tengo que cambiar el nombre del búfer eww en el que estoy, generalmente con un título sencillo sobre la página en la que estoy, y volver a llamar ewwdesde cualquier otro búfer abierto en Emacs (por ejemplo, desde el búfer en modo de búfer, o búferes directos, desde cero, otro documento, cualquiera) me lleva a otro búfer eww. Finalmente voy Sa la lista de buffers de eww para seleccionar desde allí. Extraño pero funciona, y con pocos pasos. Me pregunto por qué eww-newno fue incorporado desde el principio. Por supuesto, es más limpio con el código anterior, lo intentaré. Me alegra ver que la función se agregó en Emacs 26.

techapu
fuente
En Emacs 27, llamar ewwcon un argumento prefijo ahora crea un nuevo búfer EWW; mira mi respuesta arriba.
Basil
Si no desea inventar un nuevo nombre de búfer, vaya con M-x rename-uniquely.
Stefan
Gracias Stefan por el consejo. Tengo Debian 9 y estoy tan lejos de Emacs 27 :(
techapu
De todos modos tendré que actualizar mi Emacs, uso el navegador incorporado todo el tiempo. Y w3m rompe mi flujo con las pestañas. Eww es práctico y es todo lo que necesito. Esta característica es realmente importante, gracias a Basil por la actualización, el comando personalizado que comparte parece una alternativa inteligente al comportamiento estándar. Voy todo el tiempo entre los archivos de organización, las memorias intermedias de información, los terminales y el navegador eww y sería bueno tener eww a mano sin enterrar la página anterior.
techapu
@Stefan, el problema que veo con esa solución es que necesito saber qué hay en el búfer, así que volveré más tarde allí. ¿Cuál sería la salida rename-uniquely?
techapu 02 de