回答:
あなたは正しいですewwが、自動的に新しいバッファを作成しません。しかし、私はergoemacs.orgからのこのトリックを使用しており、それはうまく機能します!
以下が評価さ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)
rename-uniquelyただし、を使用して部分的な修正を取得しました。これは、ewweww以外のバッファーからアクティブ化した場合に効果的です。ただし、ewwバッファーにいる場合は、モードが変更されないため、フックは起動しません。少なくとも私はそれが起こっていると思います。
M-x ewweww以外のバッファから実行した場合にのみ、意図したとおりに機能します。ewwバッファー内に新しいewwバッファーを生成するつもりかどうかは明確ではありませんでした。何か思いついた場合は、ソリューションを更新します。私はまた、マスターの最新ビルドにいます。
eww、ソースコードに示されている関数の設計にあります(pop-to-buffer-same-window (if (eq major-mode 'eww-mode) (current-buffer) (get-buffer-create "*eww*")))。
更新
この動作はバグ#34374で議論され、2019-02-15にマージされました。
したがって、Emacs 27ではeww、前置引数を指定して呼び出すと、デフォルトの*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ます。また、より便利なキーにグローバルにバインドすることもできます。
少しRPディロンスニペットを拡張しました。のようなエイリアスを作成し(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)
)))
Emacs 25.1を使用していeww-open-in-new-bufferますが、関数がありません。だから私は現在入っているページについての簡単なタイトルを付けて、現在入っているバッファの名前を変更ewwし、Emacsで開かれている他のバッファから(たとえば、バッファモードバッファやdiredバッファから)再度呼び出す必要がありますゼロから、別のドキュメントなど)別のewwバッファーに移動します。最後にS、ewwバッファーリストに移動して、そこから選択します。奇妙ですが、機能し、いくつかのステップがあります。なぜeww-new最初から組み込まれていなかったのかしら。もちろん、上記のコードの方がきれいなので、試してみましょう。この関数がEmacs 26で追加されたことをうれしく思います。
eww、前置引数を指定して呼び出すと、新しいEWWバッファーが作成されます。上記の私の答えを参照してください。
M-x rename-uniquely。
eww、前置引数付きの呼び出しのサポートを追加しました。以下の私の答えを見てください。