複数のewwバッファーを作成する簡単な方法


10

M-x ewwURLまたはキーワードの入力を求め、新しい*eww*バッファを開きます。でeww-modeGにバインドされてewwいます。これは、単一のewwバッファーのコンテンツを置き換えます。

異なるWebページ用に複数のバッファーを作成するために、新しいバッファーを作成し、eww-mode手動で設定してからG(またはM-x eww)を押してURLにアクセスしました。

これをすべて行う関数を簡単に作成できますが、この機能が組み込みだけではないことに驚いています。私はそれを逃しているだけですか?


Emacs 27はeww、前置引数付きの呼び出しのサポートを追加しました。以下の私の答えを見てください。
バジル

回答:


6

あなたは正しいです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)

これはEmacs 25では動作しないようです(私はマスターからビルドしています)。rename-uniquelyただし、を使用して部分的な修正を取得しました。これは、ewweww以外のバッファーからアクティブ化した場合に効果的です。ただし、ewwバッファーにいる場合は、モードが変更されないため、フックは起動しません。少なくとも私はそれが起こっていると思います。
RPディロン

あなたが正しい。私が投稿したものは、M-x ewweww以外のバッファから実行した場合にのみ、意図したとおりに機能します。ewwバッファー内に新しい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ディロン2016

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前置引数を指定して呼び出すと、デフォルトの*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ディロンスニペットを拡張しました。のようなエイリアスを作成し(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し、Emacsで開かれている他のバッファから(たとえば、バッファモードバッファやdiredバッファから)再度呼び出す必要がありますゼロから、別のドキュメントなど)別のewwバッファーに移動します。最後にS、ewwバッファーリストに移動して、そこから選択します。奇妙ですが、機能し、いくつかのステップがあります。なぜeww-new最初から組み込まれていなかったのかしら。もちろん、上記のコードの方がきれいなので、試してみましょう。この関数がEmacs 26で追加されたことをうれしく思います。


Emacs 27ではeww、前置引数を指定して呼び出すと、新しいEWWバッファーが作成されます。上記の私の答えを参照してください。
バジル

新しいバッファ名を作成したくない場合は、を使用してくださいM-x rename-uniquely
ステファン

ステファン、ありがとう。私はDebian 9を使用していますが、これまでのところEmacs 27 :(
techapu

とにかく、Emacsを更新する必要があります。私は常に組み込みのブラウザーを使用しています。そして、w3mはタブでフローを中断します。Ewwは実用的で、必要なのはそれだけです。この機能は非常に重要です。Basilの更新に感謝します。共有するカスタムコマンドは、標準の動作の賢い代替手段のようです。私は常に組織ファイル、情報バッファー、端末、ewwブラウザーの間を行き来しています。前のページを埋めることなくewwを手元に置いておくと便利です。
techapu

@Stefanその解決策で私が見る問題は、バッファに何が入っているかを知る必要があるため、後でそこに戻ることです。rename-uniquelyの出力は何でしょうか?
techapu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.