回答:
あなたは正しいです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
ただし、を使用して部分的な修正を取得しました。これは、eww
eww以外のバッファーからアクティブ化した場合に効果的です。ただし、ewwバッファーにいる場合は、モードが変更されないため、フックは起動しません。少なくとも私はそれが起こっていると思います。
M-x eww
eww以外のバッファから実行した場合にのみ、意図したとおりに機能します。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-buffer
RETます。また、より便利なキーにグローバルにバインドすることもできます。
少し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
、前置引数付きの呼び出しのサポートを追加しました。以下の私の答えを見てください。