여러 개의 eww 버퍼를 생성하는 간단한 방법


10

M-x ewwURL 또는 키워드를 묻고 새 *eww*버퍼를 엽니 다 . 에서 eww-mode, G결합되어 eww하나의 우엑 버퍼의 내용을 대체한다.

다른 웹 페이지에 대해 여러 개의 버퍼를 만들려면 새 버퍼를 만들고 eww-mode수동으로 설정 한 다음 G(또는 M-x eww)을 눌러 URL을 방문했습니다.

나는 나를 위해이 모든 것을 수행하는 함수를 쉽게 작성할 수 있지만이 기능이 내장되어 있지 않은 것에 놀랐습니다. 방금 놓쳤습니까?


Emacs 27은 이제 ewwprefix 인수로 호출 하는 기능을 지원합니다 . 아래 내 답변을 참조하십시오.
Basil

답변:


6

eww자동으로 새 버퍼를 작성하지 않는 것이 맞습니다 . 그러나 나는 ergoemacs.org 에서이 트릭을 사용하고 있으며 훌륭하게 작동합니다!

아래의 평가판을 사용하면 eww 버퍼 M-x 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 버퍼에 있으면 모드가 변경되지 않기 때문에 후크가 실행되지 않습니다. 적어도 나는 그것이 일어나고 있다고 생각합니다.
RP Dillon

네가 옳아. 내가 게시 한 내용은 M-x eww비 eww 버퍼에서 수행하는 경우에만 의도 한대로 작동합니다 . 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 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년 2월 15일 .

그래서 이맥스 (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로 호출 하여 명령에서 tantrum을 발생시키지 않습니다.

이 명령은 EWW 버퍼 내외부에서 모두 작동하므로 eww-open-in-new-buffer원하는 경우 default 대신 드롭 인 대체 기능을 수행 할 수 있습니다 .

(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 버퍼의 이름을 바꾸고 ewwEmacs에서 열린 다른 버퍼 (예 : 버퍼 모드 버퍼 또는 dired 버퍼)에서 다시 호출해야합니다 . 처음부터 다른 문서, 다른)를 다른 eww 버퍼로 데려갑니다. 마지막으로 Seww 버퍼 목록 으로 이동하여 거기서 선택합니다. 홀수이지만 작동하지만 몇 단계 만 거치면됩니다. 왜 eww-new처음부터 내장되지 않았 는지 궁금 합니다. 물론 위의 코드로 더 깨끗합니다. 나는 그것을 시도 할 것입니다. 이맥스 26에 기능이 추가 된 것을 알게되어 기쁩니다.


Emacs 27에서 ewwprefix 인수로 호출 하면 새로운 EWW 버퍼가 생성됩니다. 위의 답변을 참조하십시오.
Basil

새 버퍼 이름을 발명하지 않으려면로 이동하십시오 M-x rename-uniquely.
Stefan

팁 주셔서 감사합니다. 나는 데비안 9를 가지고 있고 지금까지 Emacs 27입니다. :(
techapu

어쨌든 나는 Emacs를 업데이트해야하며 항상 내장 브라우저를 사용합니다. 그리고 w3m은 탭으로 흐름을 깨뜨립니다. Eww는 실용적이며 내가 필요한 전부입니다. 이 기능은 업데이트에 대한 Basil 덕분에 정말 중요합니다. 공유하는 사용자 지정 명령은 표준 동작의 영리한 대안으로 보입니다. 나는 항상 org 파일, 정보 버퍼, 터미널 및 eww 브라우저 사이를 이동하며 이전 페이지를 묻지 않고 eww를 얻는 것이 좋을 것입니다.
techapu

@Stefan 그 솔루션으로 볼 수있는 문제는 버퍼에 무엇이 있는지 알아야하므로 나중에 돌아올 것입니다. 이름 바꾸기 고유 출력은 무엇입니까?
techapu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.