Metodo semplice per la creazione di più buffer eww


10

M-x ewwrichiede url o parole chiave e apre un nuovo *eww*buffer. In eww-mode, Gè associato a eww, che sostituisce il contenuto del singolo buffer eww.

Per creare più buffer per diverse pagine Web, ho fatto ricorso alla creazione di un nuovo buffer, all'impostazione eww-modemanuale, quindi premendo G(o M-x eww) per visitare un URL.

Posso facilmente scrivere una funzione che fa tutto questo per me, ma sono sorpreso che questa funzionalità non sia solo integrata. Mi manca solo?


Emacs 27 ora aggiunge il supporto per la chiamata ewwcon un argomento prefisso; vedi la mia risposta qui sotto.
Basilio

Risposte:


6

Hai ragione che ewwnon crea automaticamente nuovi buffer per te. Ma sto usando questo trucco da ergoemacs.org e funziona benissimo!

Con la valutazione di seguito, ogni volta che lo fai M-x ewwda un buffer non eww , verrà creato un buffer eww unico.

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

Se desideri generare un nuovo buffer eww mentre ti trovi in ​​un buffer eww, valuta i consigli di seguito (dovrai comunque valutare quanto sopra in modo che ai nuovi ewwbuffer vengano assegnati nomi univoci).

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

Questo non sembra funzionare per me in Emacs 25 (sto costruendo dal maestro). Ho ottenuto una correzione parziale utilizzando rename-uniquely, tuttavia, che è efficace se si attiva ewwda un buffer non eww. Se sono in un buffer eww, tuttavia, l'hook non si attiva, perché la modalità non sta cambiando. Almeno penso che stia succedendo.
RP Dillon,

Hai ragione. Quello che ho pubblicato funziona esattamente come previsto solo se lo fai M-x ewwda un buffer non eww. Non era chiaro se si intendeva avere un nuovo buffer eww generato in un buffer eww. Aggiornerò la soluzione se trovo qualcosa. Sono anche all'ultima build di master.
Kaushal Modi,

Questo comportamento è nella progettazione della ewwfunzione di come si è visto nel codice sorgente: (pop-to-buffer-same-window (if (eq major-mode 'eww-mode) (current-buffer) (get-buffer-create "*eww*"))).
Kaushal Modi,

@RPDillon Guarda l'aggiornamento con i consigli che funzionano per te.
Kaushal Modi,

Grazie per l'aggiornamento! In realtà, l'approccio basato sui consigli non sembra funzionare. Sto pensando che un approccio più semplice usando una funzione potrebbe adattarmi meglio.
RP Dillon

3

Sembra che ewwsia progettato per evitare questo comportamento. Questa funzione, eww-newpuò essere chiamata quando si desidera un nuovo buffer 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

Aggiornare

Questo comportamento è stato discusso nel bug n. 34374 e unito il 15-02-2019 .

Quindi in Emacs 27, chiamare ewwcon un argomento prefisso gli dice di usare un nuovo buffer invece di riutilizzare il *eww*buffer predefinito .


Sono sorpreso che questa funzionalità non sia solo integrata. Mi manca solo?

Sì e no. Funzionalità simili sono state aggiunte in Emacs 26 come comando eww-open-in-new-buffer, che M-RETper impostazione predefinita è associato ai buffer 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.

L'unico problema è che, al momento della scrittura, questo comando si limita a funzionare solo nei buffer EWW. In particolare, genera un user-errorcollegamento se non viene trovato alcun punto significativo, come determinato dall'opzione utente 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.

Un'ulteriore limitazione del comando è che non richiede all'utente un URL o termini di ricerca, come ewwfarebbe il comando .

Ecco un semplice esempio di come è possibile colmare queste differenze tra ewwe 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)))

Quello che fa è prima chiamare la interactivespecifica di eww, che richiede URL o termini di ricerca come al solito. Quindi chiama eww-open-in-new-buffercon gli URL o i termini di ricerca precedentemente immessi come unico URI suggerito, in modo che il comando non dia una scossa.

Questo comando funzionerà sia all'interno che senza i buffer EWW, quindi può fungere da sostituzione drop-in per impostazione predefinita eww-open-in-new-buffer, se si preferisce:

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

Ad ogni modo, puoi invocarlo da qualsiasi luogo M-xmy-eww-new-bufferRETo legarlo globalmente a una chiave più conveniente.


0

Ho esteso un po 'di frammento di RP Dillon . Che lo rendono un buon candidato per creare un alias simile (defalias 'w #'af/eww)e aprire eww usando la funzione di seguito. L'unica differenza è il controllo condizionale se il *eww*buffer esiste già, quindi ne viene creato uno nuovo, se non ewwviene invocato il 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)
    )))

0

Uso Emacs 25.1 e la eww-open-in-new-bufferfunzione non è presente. Quindi devo rinominare il buffer eww in cui mi trovo, di solito con un semplice titolo sulla pagina in cui mi trovo, e richiamare di nuovo ewwda qualsiasi altro buffer aperto in Emacs (ad esempio dal buffer in modalità buffer o dai buffer diretti, da zero, un altro documento, qualsiasi) mi porta ad un altro buffer eww. Infine vado con Sl'elenco dei buffer eww per selezionare da lì. Strano ma funziona e con pochi passaggi. Mi chiedo perché eww-newnon sia stato incorporato dall'inizio. Ovviamente è più pulito con il codice sopra, ci proverò. Sono contento di vedere che la funzione è stata aggiunta in Emacs 26.


In Emacs 27, chiamare ewwcon un argomento prefisso ora crea un nuovo buffer EWW; vedi la mia risposta sopra.
Basilio

Se non vuoi inventare un nuovo nome di buffer, vai con M-x rename-uniquely.
Stefan

Grazie Stefan per l'informazione. Ho Debian 9 e sono così lontano da Emacs 27 :(
techapu

Ad ogni modo dovrò aggiornare il mio Emacs, utilizzo sempre il browser integrato. E w3m interrompe il mio flusso con le schede. Eww è pratico ed è tutto ciò di cui ho bisogno. Questa funzionalità è davvero importante, grazie a Basil per l'aggiornamento, il comando personalizzato che condividi sembra un'alternativa intelligente al comportamento standard. Vado sempre tra i file dell'organizzazione, i buffer di informazioni, i terminali e il browser eww e sarebbe bello avere eww a portata di mano senza seppellire la pagina precedente.
techapu,

@Stefan il problema che vedo con quella soluzione è che ho bisogno di sapere cosa c'è nel buffer, quindi torno più tardi. Quale sarebbe l'output in modo univoco rinominato?
techapu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.