Einfache Methode zum Erstellen mehrerer eww-Puffer

10

M-x ewwfordert zur Eingabe von URLs oder Schlüsselwörtern auf und öffnet einen neuen *eww*Puffer. In eww-mode, Gist gebunden an eww, was den Inhalt des einzelnen eww-Puffers ersetzt.

Um mehrere Puffer für verschiedene Webseiten zu erstellen, habe ich einen neuen Puffer erstellt, eww-modemanuell eingestellt und dann G(oder M-x eww) gedrückt , um eine URL aufzurufen.

Ich kann leicht eine Funktion schreiben, die all dies für mich erledigt, aber ich bin überrascht, dass diese Funktionalität nicht nur integriert ist. Vermisse ich es nur?

RP Dillon
quelle
Emacs 27 unterstützt jetzt das Aufrufen ewwmit einem Präfixargument. siehe meine Antwort unten.
Basil

Antworten:

6

Sie haben Recht, dass ewwnicht automatisch neue Puffer für Sie erstellt werden. Aber ich habe diesen Trick von ergoemacs.org benutzt und er funktioniert großartig!

Mit der folgenden Bewertung wird jedes Mal, wenn Sie dies M-x ewwaus einem Nicht-Eww- Puffer heraus tun , ein eindeutiger Eww-Puffer erstellt.

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

Wenn Sie einen neuen eww-Puffer erzeugen möchten, während Sie sich in einem eww-Puffer befinden, überprüfen Sie die folgenden Hinweise (Sie müssen die obigen Hinweise noch bewerten, damit neuen ewwPuffern eindeutige Namen zugewiesen werden).

;; 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
quelle
Dies scheint für mich in Emacs 25 nicht zu funktionieren (ich baue vom Meister). Ich habe jedoch eine teilweise Korrektur mit erhalten rename-uniquely, die effektiv ist, wenn ich ewwaus einem Nicht-EwW-Puffer aktiviere . Wenn ich mich jedoch in einem eww-Puffer befinde, wird der Hook nicht ausgelöst, da sich der Modus nicht ändert. Zumindest denke ich, dass das passiert.
RP Dillon
Du hast recht. Was ich gepostet habe, funktioniert nur dann genau wie beabsichtigt, wenn Sie es M-x ewwaus einem Nicht-Eww-Puffer tun . Es war nicht klar, ob Sie beabsichtigten, einen neuen Eww-Puffer in einem Eww-Puffer zu erzeugen. Ich werde die Lösung aktualisieren, wenn mir etwas einfällt. Ich bin auch auf dem neuesten Stand von Master.
Kaushal Modi
Dieses Verhalten ist beim Entwurf der ewwFunktion im Quellcode zu sehen : (pop-to-buffer-same-window (if (eq major-mode 'eww-mode) (current-buffer) (get-buffer-create "*eww*"))).
Kaushal Modi
@RPDillon Siehe das Update mit den Ratschlägen funktioniert für Sie.
Kaushal Modi
Danke für das Update! Der Ansatz mit Ratschlägen scheint eigentlich nicht zu feuern. Ich denke, ein einfacherer Ansatz mit einer Funktion passt am besten zu mir.
RP Dillon
3

Es scheint darauf ewwausgelegt zu sein, dieses Verhalten zu vermeiden. Diese Funktion eww-newkann aufgerufen werden, wenn ein neuer eww-Puffer gewünscht wird:

(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
quelle
3

Aktualisieren

Dieses Verhalten wurde in Fehler # 34374 besprochen und am 15.02.2019 zusammengeführt .

Wenn Sie in Emacs 27 ewwmit einem Präfixargument aufrufen , wird ein neuer Puffer verwendet, anstatt den Standardpuffer *eww*wiederzuverwenden.


Ich bin überrascht, dass diese Funktionalität nicht nur integriert ist. Vermisse ich es nur?

Ja und nein. In Emacs 26 wurde eine ähnliche Funktionalität hinzugefügt wie der Befehl eww-open-in-new-buffer, an den M-RETstandardmäßig in EWW-Puffern gebunden ist :

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.

Das einzige Problem ist, dass dieser Befehl zum Zeitpunkt des Schreibens nur in EWW-Puffern ausgeführt werden kann. Insbesondere wird ein user-errorPunkt ausgelöst, wenn an der Stelle kein aussagekräftiger Link gefunden wird, wie durch die Benutzeroption festgelegt 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.

Eine weitere Einschränkung des Befehls besteht darin, dass der Benutzer nicht wie im Befehl nach einer URL oder Suchbegriffen gefragt wird eww.

Hier ist ein einfaches Beispiel, wie Sie diese Unterschiede zwischen ewwund überbrücken können 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)))

Was dies bedeutet ist erster Aufruf der interactiveSpezifikation von eww, die Eingabeaufforderungen für URLs oder Begriffe wie gewohnt suchen. Anschließend wird eww-open-in-new-buffermit den zuvor eingegebenen URLs oder Suchbegriffen als einziger vorgeschlagener URI aufgerufen, sodass der Befehl keinen Wutanfall auslöst.

Dieser Befehl funktioniert sowohl innerhalb als auch außerhalb von EWW-Puffern, sodass er als Ersatz für die Standardeinstellung dienen kann eww-open-in-new-buffer, wenn Sie Folgendes bevorzugen:

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

In beiden Fällen können Sie es von überall aus aufrufen M-xmy-eww-new-bufferREToder global an einen bequemeren Schlüssel binden.

Basilikum
quelle
0

Ich habe ein bisschen RP Dillon Snippet erweitert. Was es zu einem guten Kandidaten macht, Alias ​​wie zu erstellen (defalias 'w #'af/eww)und eww mit der folgenden Funktion zu öffnen. Der einzige Unterschied besteht in der bedingten Überprüfung, ob der *eww*Puffer bereits vorhanden ist. Dann wird ein neuer erstellt, wenn nicht der native ewwaufgerufen wird.

(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
quelle
0

Ich benutze Emacs 25.1 und die eww-open-in-new-bufferFunktion ist nicht da. Daher muss ich den eww-Puffer, in dem ich mich befinde, umbenennen, normalerweise mit einem einfachen Titel über die Seite, in der ich mich ewwbefinde , und erneut aus einem anderen in Emacs geöffneten Puffer aufrufen (z. B. aus dem Puffer im Puffermodus oder aus dired-Puffern). Von Grund auf neu bringt mich ein anderes Dokument zu einem anderen eww-Puffer. Zum Schluss gehe ich Szur eww Pufferliste, um dort auszuwählen. Seltsam, aber es funktioniert und mit wenigen Schritten. Ich frage mich, warum eww-newnicht von Anfang an eingebaut wurde. Natürlich ist es mit dem obigen Code sauberer, ich werde es versuchen. Ich bin froh zu sehen, dass die Funktion in Emacs 26 hinzugefügt wurde.

Techapu
quelle
In Emacs 27 wird durch Aufrufen ewwmit einem Präfixargument jetzt ein neuer EWW-Puffer erstellt. siehe meine Antwort oben.
Basil
Wenn Sie keinen neuen Puffernamen erfinden möchten, fahren Sie mit fort M-x rename-uniquely.
Stefan
Danke Stefan für den Tipp. Ich habe Debian 9 und ich bin so weit von Emacs 27 :(
Techapu
Wie auch immer, ich muss meine Emacs aktualisieren, ich benutze die ganze Zeit den eingebauten Browser. Und w3m unterbricht meinen Fluss mit den Tabs. Eww ist praktisch und alles was ich brauche. Diese Funktion ist wirklich wichtig, danke Basil für das Update. Der benutzerdefinierte Befehl, den Sie freigeben, scheint eine clevere Alternative zum Standardverhalten zu sein. Ich gehe die ganze Zeit zwischen den Organisationsdateien, den Infopuffern, den Terminals und dem eww-Browser hin und her und es wäre schön, eww zur Hand zu haben, ohne die vorherige Seite zu vergraben.
Techapu
@Stefan Das Problem, das ich bei dieser Lösung sehe, ist, dass ich wissen muss, was sich im Puffer befindet, damit ich später dorthin zurückkehre. Was wäre die Umbenennungs-eindeutige Ausgabe?
Techapu