Metode sederhana untuk membuat beberapa buffer eww

10

M-x ewwmeminta url atau kata kunci dan membuka *eww*buffer baru . In eww-mode, Gterikat eww, yang menggantikan konten buffer eww tunggal.

Untuk membuat beberapa buffer untuk halaman web yang berbeda, saya terpaksa membuat buffer baru, mengatur eww-modesecara manual, lalu menekan G(atau M-x eww) untuk mengunjungi URL.

Saya dapat dengan mudah menulis fungsi yang melakukan semua ini untuk saya, tetapi saya terkejut fungsi ini bukan hanya bawaan. Apakah saya hanya melewatkannya?

RP Dillon
sumber
Emacs 27 sekarang menambahkan dukungan untuk menelepon ewwdengan argumen awalan; lihat jawaban saya di bawah ini.
Basil

Jawaban:

6

Anda benar yang ewwtidak secara otomatis membuat buffer baru untuk Anda. Tapi saya telah menggunakan trik ini dari ergoemacs.org dan ini sangat bagus!

Dengan eval'ed di bawah ini, setiap kali Anda melakukannya M-x ewwdari buffer non-eww , buffer eww unik akan dibuat.

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

Jika Anda ingin menelurkan buffer eww baru saat berada di buffer eww, eval saran di bawah ini (Anda masih perlu eval di atas sehingga ewwbuffer baru diberi nama unik).

;; 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
sumber
Ini sepertinya tidak bekerja untuk saya di Emacs 25 (saya membangun dari master). Saya memang mendapatkan perbaikan parsial menggunakan rename-uniquely, yang efektif jika saya aktifkan ewwdari buffer non-eww. Namun, jika saya berada di buffer baru, kait tidak menyala, karena mode tidak berubah. Setidaknya saya pikir itulah yang terjadi.
RP Dillon
Kamu benar. Apa yang saya posting berfungsi persis seperti yang dimaksudkan hanya jika Anda melakukannya M-x ewwdari buffer non-eww. Tidak jelas apakah Anda berniat untuk memiliki bibit eww buffer baru saat dalam buffer eww. Saya akan memperbarui solusinya jika saya menemukan sesuatu. Saya juga sedang membangun master terbaru.
Kaushal Modi
Perilaku ini di desain ewwfungsi seperti yang terlihat dalam kode sumber: (pop-to-buffer-same-window (if (eq major-mode 'eww-mode) (current-buffer) (get-buffer-create "*eww*"))).
Kaushal Modi
@RPDillon Lihat pembaruan dengan saran berfungsi untuk Anda.
Kaushal Modi
Terima kasih atas pembaruannya! Pendekatan menggunakan saran sepertinya tidak memecat, sebenarnya. Saya pikir pendekatan yang lebih sederhana menggunakan fungsi mungkin cocok untuk saya.
RP Dillon
3

Tampaknya ewwdirancang untuk menghindari perilaku ini. Fungsi ini eww-new,, dapat dipanggil ketika buffer eww baru diinginkan:

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

Memperbarui

Perilaku ini dibahas dalam bug # 34374 dan bergabung pada 2019-02-15 .

Jadi dalam Emacs 27, memanggil ewwdengan argumen awalan memberitahu untuk menggunakan buffer baru alih-alih menggunakan kembali *eww*buffer default .


Saya terkejut fungsi ini bukan hanya bawaan. Apakah saya hanya melewatkannya?

Iya dan tidak. Fungsionalitas serupa ditambahkan di Emacs 26 sebagai perintah eww-open-in-new-buffer, yang terikat M-RETpada buffer EWW secara default:

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.

Satu-satunya masalah adalah bahwa, pada saat penulisan, perintah ini terbatas hanya berfungsi di buffer EWW. Secara khusus, ia melempar user-errorjika tidak ada tautan yang berarti ditemukan di titik, sebagaimana ditentukan oleh opsi pengguna 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.

Batasan lebih lanjut dari perintah ini adalah tidak meminta pengguna untuk URL atau istilah pencarian, seperti yang ewwakan dilakukan oleh perintah .

Berikut adalah contoh sederhana tentang bagaimana Anda dapat menjembatani perbedaan antara ewwdan 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)))

Apa yang dilakukan adalah panggilan pertama interactivespesifikasi dari eww, yang petunjuknya untuk URL atau istilah pencarian seperti biasa. Ini kemudian memanggil eww-open-in-new-bufferdengan URL input sebelumnya atau istilah pencarian sebagai satu-satunya URI yang disarankan, sehingga perintah tidak membuat ulah.

Perintah ini akan berfungsi baik di dalam maupun tanpa buffer EWW, sehingga dapat bertindak sebagai pengganti drop-in untuk default eww-open-in-new-buffer, jika Anda lebih suka:

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

Apa pun itu, Anda dapat memintanya dari mana saja M-xmy-eww-new-bufferRETatau mengikatnya secara global ke kunci yang lebih nyaman.

Kemangi
sumber
0

Saya memperpanjang potongan RP Dillon sedikit . Yang menjadikannya kandidat yang bagus untuk membuat alias seperti (defalias 'w #'af/eww)dan membuka eww menggunakan fungsi di bawah ini. Satu-satunya perbedaan adalah pemeriksaan bersyarat jika *eww*buffer sudah ada, maka yang baru dibuat, jika bukan yang asli ewwdipanggil.

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

Saya menggunakan Emacs 25.1 dan eww-open-in-new-bufferfungsinya tidak ada. Jadi saya harus mengganti nama eww buffer yang saya masuki, biasanya dengan beberapa judul mudah tentang halaman yang saya ewwmasuki , dan menelepon lagi dari buffer lain yang dibuka di Emacs (dengan contoh dari buffer-mode buffer, atau buffer yang dired, dari awal, dokumen lain, apa saja) membawaku ke buffer eww lain. Akhirnya saya pergi dengan Ske daftar buffer eww untuk memilih dari sana. Aneh tapi berhasil, dan dengan beberapa langkah. Saya bertanya-tanya mengapa eww-newtidak built-in dari awal. Tentu saja lebih bersih dengan kode di atas, saya akan mencobanya. Saya senang melihat bahwa fungsi tersebut ditambahkan di Emacs 26.

techapu
sumber
Di Emacs 27, menelepon ewwdengan argumen awalan sekarang membuat buffer EWW baru; lihat jawaban saya di atas.
Basil
Jika Anda tidak ingin membuat nama buffer baru, ikuti M-x rename-uniquely.
Stefan
Stefan terima kasih atas tipnya. Saya memiliki Debian 9 dan saya sejauh ini dari Emacs 27 :(
techapu
Lagi pula saya harus memperbarui Emacs saya, saya menggunakan browser bawaan setiap saat. Dan w3m memutus aliran saya dengan tab. Eww praktis dan itu yang saya butuhkan. Fitur ini sangat penting, terima kasih Basil untuk pembaruan, perintah kustom yang Anda bagikan tampaknya merupakan alternatif cerdas untuk perilaku standar. Saya pergi di antara file org, buffer info, terminal dan browser eww sepanjang waktu dan akan menyenangkan untuk memiliki eww di tangan tanpa mengubur halaman sebelumnya.
techapu
@Stefan masalahnya saya melihat dengan solusi itu adalah bahwa saya perlu tahu apa yang ada di buffer jadi saya kembali lagi nanti. Apa yang akan menjadi keluaran-nama unik?
techapu