Phương pháp đơn giản để tạo nhiều bộ đệm eww


10

M-x ewwlời nhắc cho url hoặc từ khóa và mở một *eww*bộ đệm mới . Trong eww-mode, Gbị ràng buộc eww, thay thế nội dung của bộ đệm eww duy nhất.

Để tạo nhiều bộ đệm cho các trang web khác nhau, tôi đã sử dụng cách tạo bộ đệm mới, cài đặt eww-modethủ công, sau đó nhấn G(hoặc M-x eww) để truy cập URL.

Tôi có thể dễ dàng viết một hàm thực hiện tất cả điều này cho tôi, nhưng tôi ngạc nhiên rằng chức năng này không chỉ được tích hợp sẵn. Có phải tôi chỉ thiếu nó?


Emacs 27 hiện thêm hỗ trợ cho việc gọi ewwbằng đối số tiền tố; xem câu trả lời của tôi dưới đây
Basil

Câu trả lời:


6

Bạn đúng là ewwkhông tự động tạo bộ đệm mới cho bạn. Nhưng tôi đã sử dụng thủ thuật này từ ergoemacs.org và nó hoạt động rất tốt!

Với các đánh giá dưới đây, mỗi lần bạn thực hiện M-x ewwtừ bộ đệm không phải eww , bộ đệm eww duy nhất sẽ được tạo.

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

Nếu bạn muốn sinh ra một bộ đệm eww mới trong khi đang ở trong một bộ đệm eww, hãy từ chối lời khuyên dưới đây (bạn vẫn sẽ cần phải đánh giá ở trên để ewwbộ đệm mới được gán tên duy nhất).

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

Điều này dường như không hoạt động đối với tôi trong Emacs 25 (Tôi đang xây dựng từ bậc thầy). Tôi đã nhận được một phần sửa chữa bằng cách sử dụng rename-uniquely, tuy nhiên, nó có hiệu quả nếu tôi kích hoạt ewwtừ bộ đệm không phải là eww. Tuy nhiên, nếu tôi đang ở trong bộ đệm eww, thì hook không kích hoạt, vì chế độ không thay đổi. Ít nhất tôi nghĩ đó là những gì đang xảy ra.
RP Dillon

Bạn đúng. Những gì tôi đã đăng hoạt động chính xác như dự định chỉ khi bạn làm M-x ewwtừ một bộ đệm không phải là eww. Không rõ liệu bạn có ý định sinh ra bộ đệm eww mới trong khi ở bộ đệm eww không. Tôi sẽ cập nhật giải pháp nếu tôi nghĩ ra thứ gì đó. Tôi cũng đang trên bản dựng mới nhất của chủ.
Kaushal Modi

Hành vi này là trong thiết kế của ewwchức năng như được thấy trong mã nguồn : (pop-to-buffer-same-window (if (eq major-mode 'eww-mode) (current-buffer) (get-buffer-create "*eww*"))).
Kaushal Modi

@RPDillon Xem bản cập nhật với lời khuyên phù hợp với bạn.
Kaushal Modi

Cảm ơn các cập nhật! Cách tiếp cận sử dụng lời khuyên dường như không thực sự. Tôi đang nghĩ một cách tiếp cận đơn giản hơn bằng cách sử dụng một chức năng có thể phù hợp với tôi nhất.
RP Dillon

3

Nó dường như ewwđược thiết kế để tránh hành vi này. Hàm này eww-new, có thể được gọi khi muốn bộ đệm eww mới:

(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

Cập nhật

Hành vi này đã được thảo luận trong lỗi # 34374 và được hợp nhất vào năm 2019-02-15 .

Vì vậy, trong Emacs 27, việc gọi ewwvới một đối số tiền tố cho nó sử dụng bộ đệm mới thay vì sử dụng lại *eww*bộ đệm mặc định .


Tôi ngạc nhiên khi chức năng này không chỉ tích hợp sẵn. Có phải tôi chỉ thiếu nó?

Có và không. Chức năng tương tự đã được thêm vào trong Emacs 26 dưới dạng lệnh eww-open-in-new-buffer, được liên kết với M-RETbộ đệm EWW theo mặc định:

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.

Vấn đề duy nhất là, tại thời điểm viết, lệnh này bị giới hạn chỉ hoạt động trong bộ đệm EWW. Cụ thể, nó sẽ ném user-errornếu không tìm thấy liên kết có ý nghĩa tại điểm, như được xác định bởi tùy chọn người dùng 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.

Một hạn chế nữa của lệnh là nó không nhắc người dùng về URL hoặc cụm từ tìm kiếm, như lệnh ewwsẽ làm.

Đây là một ví dụ đơn giản về cách bạn có thể khắc phục những khác biệt giữa ewweww-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)))

Điều này không là lần đầu tiên kêu gọi các interactiveđặc tả của eww, mà nhắc nhở cho các URL hoặc các điều khoản như thường lệ tìm kiếm. Sau đó, nó gọi eww-open-in-new-buffervới các URL đầu vào trước đó hoặc cụm từ tìm kiếm dưới dạng URI được đề xuất duy nhất, để lệnh không nổi giận.

Lệnh này sẽ hoạt động cả bên trong và không có bộ đệm EWW, vì vậy nó có thể hoạt động như một sự thay thế thả xuống cho mặc định eww-open-in-new-buffer, nếu bạn thích:

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

Dù bằng cách nào, bạn có thể gọi nó từ bất cứ đâu như M-xmy-eww-new-bufferREThoặc liên kết nó trên toàn cầu với một khóa thuận tiện hơn.


0

Tôi mở rộng một đoạn RP Dillon . Điều này làm cho nó trở thành ứng cử viên tốt để tạo bí danh thích (defalias 'w #'af/eww)và mở eww bằng cách sử dụng chức năng bên dưới. Sự khác biệt duy nhất là kiểm tra có điều kiện nếu *eww*bộ đệm đã tồn tại, sau đó bộ đệm mới được tạo, nếu không phải là bản địa ewwđược gọi.

(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

Tôi sử dụng Emacs 25.1 và eww-open-in-new-bufferchức năng không có ở đó. Vì vậy, tôi phải đổi tên bộ đệm eww, thường là với một số tiêu đề dễ hiểu về trang tôi đang truy cập và gọi lại ewwtừ bất kỳ bộ đệm nào khác được mở trong Emacs (ví dụ: từ bộ đệm chế độ đệm hoặc bộ đệm được điều hướng, từ đầu, một tài liệu khác, bất kỳ) đưa tôi đến một bộ đệm eww khác. Cuối cùng tôi đi Sđến danh sách bộ đệm eww để chọn từ đó. Lạ nhưng nó hoạt động, và với vài bước. Tôi tự hỏi tại sao eww-newkhông được tích hợp từ đầu. Tất nhiên là sạch hơn với mã ở trên, tôi sẽ thử. Tôi rất vui khi thấy chức năng này đã được thêm vào trong Emacs 26.


Trong Emacs 27, việc gọi ewwvới một đối số tiền tố bây giờ tạo ra bộ đệm EWW mới; xem câu trả lời của tôi ở trên
Basil

Nếu bạn không muốn phát minh ra một tên bộ đệm mới, hãy đi cùng M-x rename-uniquely.
Stefan

Cảm ơn bạn Stefan cho tiền boa. Tôi có Debian 9 và tôi đến nay là Emacs 27 :(
techapu

Dù sao, tôi sẽ phải cập nhật Emacs của mình, tôi luôn sử dụng trình duyệt tích hợp sẵn. Và w3m phá vỡ dòng chảy của tôi với các tab. Eww là thiết thực và đó là tất cả những gì tôi cần. Tính năng này thực sự quan trọng, nhờ Basil cập nhật, lệnh tùy chỉnh mà bạn chia sẻ có vẻ là một thay thế thông minh cho hành vi tiêu chuẩn. Tôi đi giữa các tập tin org, bộ đệm thông tin, thiết bị đầu cuối và trình duyệt eww mọi lúc và thật tuyệt khi có eww trong tay mà không chôn trang trước đó.
techapu

@Stefan vấn đề tôi thấy với giải pháp đó là tôi cần biết những gì trong bộ đệm để tôi trở lại sau đó. Điều gì sẽ là đầu ra đổi tên-duy nhất?
techapu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.