Prosta metoda tworzenia wielu buforów eww

10

M-x ewwmonituje o adres URL lub słowa kluczowe i otwiera nowy *eww*bufor. W eww-mode, Gjest związany eww, co zastępuje zawartości bufora jednym eww.

Aby utworzyć wiele buforów dla różnych stron internetowych, postanowiłem utworzyć nowy bufor, ustawić eww-moderęcznie, a następnie nacisnąć G(lub M-x eww), aby odwiedzić adres URL.

Mogę łatwo napisać funkcję, która robi to wszystko za mnie, ale jestem zaskoczony, że ta funkcja nie jest tylko wbudowana. Po prostu mi tego brakuje?

RP Dillon
źródło
Emacs 27 dodaje teraz obsługę wywoływania ewwz argumentem przedrostka; patrz moja odpowiedź poniżej.
Basil

Odpowiedzi:

6

Masz rację, że ewwnie tworzy automatycznie nowych buforów dla Ciebie. Ale korzystałem z tej sztuczki z ergoemacs.org i działa świetnie!

Z poniżej eval'ed, za każdym razem zrobić M-x ewwz non-eww buforze, zostanie utworzony unikatowy bufor 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)

Jeśli chcesz odrodzić nowy bufor eww będąc w buforze eww, zapoznaj się z poniższą radą (nadal będziesz musiał ewaluować powyższe, aby nowe ewwbufory otrzymały unikalne nazwy).

;; 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
źródło
To wydaje się nie działać dla mnie w Emacs 25 (buduję od mistrza). Dostałem częściową poprawkę za pomocą rename-uniquely, co jest skuteczne, jeśli ewwaktywuję z bufora innego niż eww. Jeśli jestem w buforze eww, hak nie uruchamia się, ponieważ tryb się nie zmienia. Przynajmniej myślę, że tak się dzieje.
RP Dillon
Masz rację. To, co opublikowałem, działa dokładnie tak, jak zamierzałem, tylko jeśli robisz to M-x ewwz bufora innego niż eww. Nie było jasne, czy zamierzałeś mieć nowy spawn bufora eww w buforze eww. Zaktualizuję rozwiązanie, jeśli coś wymyślę. Jestem również na najnowszej wersji Master.
Kaushal Modi
Takie zachowanie jest w projektowaniu ewwfunkcji, jak widać w kodzie źródłowym: (pop-to-buffer-same-window (if (eq major-mode 'eww-mode) (current-buffer) (get-buffer-create "*eww*"))).
Kaushal Modi
@RPDillon Zobacz aktualizację z poradą, która Ci odpowiada.
Kaushal Modi
Dziękuję za aktualizację! Wydaje się, że podejście oparte na poradach nie działa. Myślę, że prostsze podejście przy użyciu funkcji może mi najbardziej odpowiadać.
RP Dillon
3

Wygląda na ewwto, że ma na celu uniknięcie tego zachowania. Tę funkcję eww-newmożna wywołać, gdy pożądany jest nowy bufor 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
źródło
3

Aktualizacja

To zachowanie zostało omówione w błędzie # 34374 i połączone 15.02.2019 .

Tak więc w Emacs 27 wywołanie ewwz argumentem przedrostka mówi mu, aby używał nowego bufora zamiast ponownego użycia *eww*bufora domyślnego .


Dziwi mnie, że ta funkcja nie jest tylko wbudowana. Po prostu mi tego brakuje?

Tak i nie. Podobna funkcjonalność została dodana w Emacsie 26 jako polecenie eww-open-in-new-buffer, które M-RETdomyślnie jest powiązane z buforami 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.

Jedyny problem polega na tym, że w momencie pisania ta komenda jest ograniczona do działania tylko w buforach EWW. W szczególności zgłasza, user-errorjeśli nie zostanie znaleziony znaczący link w punkcie, zgodnie z opcją użytkownikaeww-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.

Kolejnym ograniczeniem polecenia jest to, że nie monituje on użytkownika o podanie adresu URL ani wyszukiwanych terminów jako polecenia eww zrobiłoby .

Oto prosty przykład, jak można zlikwidować te różnice ewwi 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)))

Co to robi to najpierw zadzwoń interactiveSpec odeww , co skłania do adresów URL lub poszukać terminy jak zwykle. Następnie wywołuje eww-open-in-new-bufferz poprzednio wprowadzonymi adresami URL lub wyszukiwanymi terminami jako jedynym sugerowanym identyfikatorem URI, dzięki czemu polecenie nie wywołuje furii.

To polecenie będzie działać zarówno w buforach EWW, jak i bez nich, więc może działać jako zamiennik domyślny eww-open-in-new-buffer, jeśli wolisz:

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

Tak czy inaczej, możesz wywołać go z dowolnego miejsca M-xmy-eww-new-bufferRETlub powiązać globalnie z wygodniejszym kluczem.

Bazylia
źródło
0

Rozszerzyłem nieco fragment RP Dillona . Co czyni go dobrym kandydatem do tworzenia aliasów (defalias 'w #'af/eww)i otwierania eww za pomocą funkcji poniżej. Jedyną różnicą jest sprawdzenie warunkowe, czy *eww*bufor już istnieje, a następnie tworzony jest nowy, jeśli nie, ewwwywoływany jest natywny .

(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
źródło
0

Używam Emacsa 25.1 i eww-open-in-new-buffernie ma tam funkcji. Więc muszę zmienić nazwę bufora eww, w którym jestem, zwykle z pewnym łatwym tytułem na temat strony, na której jestem, i dzwonię ponownie ewwz dowolnego innego bufora otwartego w Emacsie (na przykład z bufora trybu buforowego lub buforów dired, od zera, inny dokument, dowolny) zabiera mnie do innego bufora eww. Wreszcie przechodzę Sdo listy buforów eww, aby wybrać stamtąd. Dziwne, ale działa i wymaga kilku kroków. Zastanawiam się, dlaczego eww-newnie był wbudowany od samego początku. Oczywiście z powyższym kodem jest czystszy, spróbuję. Cieszę się, że funkcja została dodana w Emacs 26.

techapu
źródło
W Emacsie 27 wywoływanie ewwz argumentem przedrostka tworzy teraz nowy bufor EWW; patrz moja odpowiedź powyżej.
Basil
Jeśli nie chcesz wymyślać nowej nazwy bufora, idź z M-x rename-uniquely.
Stefan
Dziękuję Stefan za wskazówkę. Mam Debian 9 i jak dotąd Emacs 27 :(
techapu
W każdym razie będę musiał zaktualizować Emacsa, cały czas korzystam z wbudowanej przeglądarki. A w3m przerywa mój przepływ dzięki kartom. Eww jest praktyczne i to wszystko, czego potrzebuję. Ta funkcja jest naprawdę ważna, dzięki Basilowi ​​za aktualizację, udostępnione niestandardowe polecenie wydaje się sprytną alternatywą dla standardowego zachowania. Cały czas chodzę między plikami org, buforami informacji, terminalami i przeglądarką eww i byłoby miło mieć eww pod ręką bez zakopywania poprzedniej strony.
techapu
@ Stefan Problem, który widzę w tym rozwiązaniu polega na tym, że muszę wiedzieć, co w buforze, więc wrócę tam później. Jaka byłaby unikatowa nazwa wyjściowa?
techapu