วิธีง่ายๆในการสร้างบัฟเฟอร์ eww หลายรายการ


10

M-x ewwพรอมต์สำหรับ url หรือคำหลักและเปิด*eww*บัฟเฟอร์ใหม่ ในeww-mode, Gถูกผูกไว้ewwซึ่งแทนที่เนื้อหาของบัฟเฟอร์ eww เดียว

ในการสร้างหลายบัฟเฟอร์สำหรับหน้าเว็บที่แตกต่างกันฉันใช้วิธีสร้างบัฟเฟอร์ใหม่ตั้งค่าeww-modeด้วยตนเองจากนั้นกดG(หรือM-x eww) เพื่อไปที่ URL

ฉันสามารถเขียนฟังก์ชั่นที่ใช้งานได้ทั้งหมดสำหรับฉัน แต่ฉันประหลาดใจที่ฟังก์ชั่นนี้ไม่ได้มีมาให้ในตัว ฉันเพิ่งจะหายไปหรือไม่


Emacs 27 ตอนนี้เพิ่มการสนับสนุนสำหรับการโทรewwด้วยอาร์กิวเมนต์คำนำหน้า; ดูคำตอบของฉันด้านล่าง
เพรา

คำตอบ:


6

คุณถูกต้องที่ewwไม่ได้สร้างบัฟเฟอร์ใหม่ให้คุณโดยอัตโนมัติ แต่ฉันใช้เคล็ดลับนี้จากergoemacs.orgและมันใช้งานได้ดีมาก!

เมื่อใช้ eval'ed ด้านล่างทุกครั้งที่คุณทำM-x ewwจากบัฟเฟอร์ที่ไม่ใช่ ewwบัฟเฟอร์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)

หากคุณต้องการวางบัฟเฟอร์ eww ใหม่ในขณะที่อยู่ในบัฟเฟอร์ eww ให้ทำตามคำแนะนำด้านล่าง (คุณจะต้องทำการแก้ไขข้างต้นเพื่อให้ewwบัฟเฟอร์ใหม่ได้รับการกำหนดชื่อที่ไม่ซ้ำกัน)

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

ดูเหมือนจะไม่เหมาะกับฉันใน Emacs 25 (ฉันกำลังสร้างจากเจ้านาย) ฉันได้รับการแก้ไขบางส่วนโดยใช้rename-uniquelyซึ่งมีประสิทธิภาพถ้าฉันเปิดใช้งานewwจากบัฟเฟอร์ไม่ใช่ eww ถ้าฉันอยู่ในบัฟเฟอร์ eww ฮุกจะไม่ยิงเพราะโหมดไม่เปลี่ยน อย่างน้อยฉันก็คิดว่านั่นคือสิ่งที่เกิดขึ้น
RP Dillon

คุณถูก. สิ่งที่ฉันโพสต์ทำงานได้ตามที่ตั้งใจไว้เฉพาะเมื่อคุณทำM-x ewwจากบัฟเฟอร์ที่ไม่ใช่ eww ไม่ชัดเจนว่าคุณตั้งใจจะวางไข่ eww buffer ใหม่ในขณะที่อยู่ในบัฟเฟอร์ eww ฉันจะอัปเดตวิธีแก้ปัญหาหากเกิดอะไรขึ้น ฉันยังอยู่ในการสร้างต้นแบบล่าสุด
Kaushal Modi

ลักษณะการทำงานนี้ในการออกแบบของฟังก์ชั่นที่เห็นในรหัสที่มา:eww (pop-to-buffer-same-window (if (eq major-mode 'eww-mode) (current-buffer) (get-buffer-create "*eww*")))
Kaushal Modi

@RPDillon ดูการอัปเดตพร้อมคำแนะนำที่เหมาะกับคุณ
Kaushal Modi

ขอบคุณสำหรับการอัพเดท! วิธีการใช้คำแนะนำดูเหมือนจะไม่เป็นจริง ฉันคิดว่าวิธีที่ง่ายกว่าในการใช้ฟังก์ชั่นอาจเหมาะกับฉันที่สุด
RP Dillon

3

ดูเหมือนว่าewwถูกออกแบบมาเพื่อหลีกเลี่ยงพฤติกรรมนี้ ฟังก์ชั่นนี้eww-newสามารถเรียกใช้เมื่อต้องการบัฟเฟอร์ 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

ปรับปรุง

ลักษณะการทำงานนี้ได้รับการกล่าวถึงในข้อผิดพลาด # 34374และกลมกลืนบน2019/02/15

ดังนั้นใน Emacs 27 การเรียกewwด้วยอาร์กิวเมนต์ prefixจะบอกให้ใช้บัฟเฟอร์ใหม่แทนการใช้*eww*บัฟเฟอร์เริ่มต้นใหม่


ฉันประหลาดใจที่ฟังก์ชั่นนี้ไม่ได้มีมาให้ในตัว ฉันเพิ่งจะหายไปหรือไม่

ใช่และไม่. ฟังก์ชันที่คล้ายกันถูกเพิ่มใน Emacs 26 เป็นคำสั่งeww-open-in-new-bufferซึ่งถูกผูกไว้M-RETในบัฟเฟอร์ 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.

ปัญหาเดียวก็คือว่าในขณะที่เขียนคำสั่งนี้ถูก จำกัด ให้ทำงานเฉพาะในบัฟเฟอร์ EWW โดยเฉพาะอย่างยิ่งมันจะส่งuser-errorลิงก์หากไม่พบลิงก์ที่มีความหมาย ณ จุดที่กำหนดโดยตัวเลือกผู้ใช้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.

ข้อ จำกัด เพิ่มเติมของคำสั่งคือไม่ให้ผู้ใช้ใส่ URL หรือคำค้นหาตามที่คำสั่งewwจะใช้

นี่คือตัวอย่างง่ายๆของวิธีที่คุณสามารถเชื่อมความแตกต่างระหว่างewwและ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)))

สิ่งนี้จะเป็นสายแรกinteractiveข้อมูลจำเพาะของewwที่แจ้งสำหรับ URL หรือคำค้นหาได้ตามปกติ จากนั้นเรียกใช้eww-open-in-new-bufferด้วย URL อินพุตหรือคำค้นหาก่อนหน้านี้เป็น URI ที่แนะนำเท่านั้นดังนั้นคำสั่งจะไม่ส่งเสียงฉุนเฉียว

คำสั่งนี้จะทำงานทั้งภายในและไม่มีบัฟเฟอร์ EWW ดังนั้นจึงสามารถทำหน้าที่แทนการดรอปอินสำหรับค่าเริ่มต้นeww-open-in-new-bufferได้หากคุณต้องการ:

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

ไม่ว่าจะด้วยวิธีใดคุณสามารถเรียกใช้จากที่ใดก็ได้M-xmy-eww-new-bufferRETหรือผูกไว้ทั่วโลกกับคีย์ที่สะดวกกว่า


0

ฉันขยายตัวอย่างข้อมูลRP Dillonเล็กน้อย ซึ่งทำให้ผู้สมัครที่ดีในการสร้างนามแฝงเช่น(defalias 'w #'af/eww)และเปิด eww โดยใช้ฟังก์ชั่นด้านล่าง ความแตกต่างเพียงอย่างเดียวคือการตรวจสอบแบบมีเงื่อนไขหากมี*eww*บัฟเฟอร์อยู่แล้วจะมีการสร้างบัฟเฟอร์ใหม่หากไม่มีการewwเรียกใช้เนทีฟ

(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

ฉันใช้ Emacs 25.1 และeww-open-in-new-bufferฟังก์ชั่นไม่ได้อยู่ที่นั่น ดังนั้นฉันจึงต้องเปลี่ยนชื่อบัฟเฟอร์ eww ที่ฉันมักจะมีชื่อเรื่องง่ายเกี่ยวกับหน้าฉันและเรียกอีกครั้งewwจากบัฟเฟอร์อื่น ๆ ที่เปิดใน Emacs (โดยตัวอย่างจากบัฟเฟอร์โหมดบัฟเฟอร์หรือบัฟเฟอร์ที่แห้งแล้ง) จากศูนย์เอกสารอื่น ๆ ) พาฉันไปที่บัฟเฟอร์ eww อื่น ในที่สุดฉันก็ไปSที่รายการบัฟเฟอร์ eww เพื่อเลือกจากที่นั่น แปลก แต่ก็ใช้งานได้และด้วยไม่กี่ขั้นตอน ฉันสงสัยว่าทำไมeww-newไม่ได้ติดตั้งมาตั้งแต่ต้น แน่นอนว่ามันดีกว่าโค้ดข้างต้นฉันจะลองดู ฉันดีใจที่เห็นว่ามีการเพิ่มฟังก์ชันใน Emacs 26


ใน Emacs 27 การเรียกewwด้วยอาร์กิวเมนต์ prefix จะสร้างบัฟเฟอร์ EWW ใหม่ ดูคำตอบของฉันข้างต้น
เพรา

M-x rename-uniquelyหากคุณไม่ต้องการที่จะคิดค้นชื่อกันชนใหม่ไปกับ
Stefan

ขอบคุณสำหรับเคล็ดลับสเตฟาน ฉันมี Debian 9 และฉันยังห่างไกลจาก Emacs 27 :(
techapu

อย่างไรก็ตามฉันจะต้องอัพเดต Emacs ของฉันฉันใช้เบราว์เซอร์ในตัวตลอดเวลา และ w3m ทำลายกระแสของฉันด้วยแท็บ Eww ใช้งานได้จริงและทุกอย่างที่ฉันต้องการ คุณลักษณะนี้มีความสำคัญจริง ๆ ขอบคุณโหระพาสำหรับการปรับปรุงคำสั่งที่กำหนดเองที่คุณแบ่งปันดูเหมือนจะเป็นทางเลือกที่ชาญฉลาดสำหรับพฤติกรรมมาตรฐาน ฉันไประหว่างไฟล์ org, data buffers, เทอร์มินัลและเบราว์เซอร์ eww ตลอดเวลาและมันจะดีถ้ามี eww ในมือโดยไม่ต้องฝังหน้าก่อนหน้า
techapu

@tefan ปัญหาที่ฉันเห็นด้วยวิธีการแก้ปัญหาคือฉันต้องรู้ว่าสิ่งที่อยู่ในบัฟเฟอร์ดังนั้นฉันจึงกลับมาในภายหลัง สิ่งที่จะเปลี่ยนชื่อเอาท์พุทที่ไม่ซ้ำกัน?
techapu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.