Método simples para criar vários buffers eww

10

M-x ewwsolicita URL ou palavras-chave e abre um novo *eww*buffer. Em eww-mode, Gé vinculado a eww, que substitui o conteúdo do buffer eww único.

Para criar vários buffers para diferentes páginas da web, eu recorri à criação de um novo buffer, definindo eww-modemanualmente e pressionando G(ou M-x eww) para visitar um URL.

Posso escrever facilmente uma função que faz tudo isso para mim, mas estou surpreso que essa funcionalidade não seja apenas incorporada. Eu só estou sentindo falta disso?

RP Dillon
fonte
O Emacs 27 agora adiciona suporte para chamadas ewwcom um argumento de prefixo; veja minha resposta abaixo.
Basil

Respostas:

6

Você está certo que ewwnão cria automaticamente novos buffers para você. Mas eu tenho usado esse truque no ergoemacs.org e funciona muito bem!

Com a avaliação abaixo, cada vez que você faz a M-x ewwpartir de um buffer não eww , um buffer eww exclusivo será criado.

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

Se você deseja gerar um novo buffer eww enquanto estiver em um buffer eww, avalie as recomendações abaixo (você ainda precisará avaliar o acima para que novos ewwbuffers recebam nomes exclusivos).

;; 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
fonte
Isso não parece funcionar para mim no Emacs 25 (estou construindo com o mestre). Eu recebi uma correção parcial usando rename-uniquely, no entanto, o que é eficaz se eu ativar a ewwpartir de um buffer não-eww. Se eu estiver em um buffer eww, no entanto, o gancho não dispara, porque o modo não está mudando. Pelo menos eu acho que é isso que está acontecendo.
RP Dillon
Você está certo. O que eu publiquei funciona exatamente como pretendido somente se você fizer M-x ewwum buffer que não seja eww. Não ficou claro se você pretendia gerar um novo buffer eww enquanto estava em um buffer eww. Atualizarei a solução se surgir alguma coisa. Eu também estou na versão mais recente do master.
Kaushal Modi
Este comportamento está no projeto da ewwfunção como visto no código fonte: (pop-to-buffer-same-window (if (eq major-mode 'eww-mode) (current-buffer) (get-buffer-create "*eww*"))).
Kaushal Modi
@RPDillon Veja a atualização com os conselhos para você.
Kaushal Modi
Obrigado pela atualização! A abordagem que utiliza conselhos não parece disparar, na verdade. Eu estou pensando que uma abordagem mais simples usando uma função pode me servir melhor.
RP Dillon
3

Parece que ewwfoi projetado para evitar esse comportamento. Esta função eww-new,, pode ser chamada quando um novo buffer eww for desejado:

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

Atualizar

Esse comportamento foi discutido no bug # 34374 e mesclado em 15/02/2019 .

Assim, no Emacs 27, chamar ewwcom um argumento prefix diz para usar um novo buffer em vez de reutilizar o *eww*buffer padrão .


Estou surpreso que essa funcionalidade não seja apenas incorporada. Eu só estou sentindo falta disso?

Sim e não. Funcionalidade semelhante foi adicionada no Emacs 26 como o comando eww-open-in-new-buffer, que está vinculado aos M-RETbuffers do EWW por padrão:

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.

O único problema é que, no momento da escrita, esse comando se limita a trabalhar apenas em buffers EWW. Em particular, ele lança um user-errorse nenhum link significativo for encontrado no momento, conforme determinado pela opção do usuário 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.

Uma limitação adicional do comando é que ele não solicita ao usuário um URL ou termos de pesquisa, como ewwseria o comando .

Aqui está um exemplo simples de como você pode superar essas diferenças entre ewwe 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)))

O que isto significa é primeira chamada a interactiveespecificação de ewwque prompts para URLs ou pesquisar termos como de costume. Em seguida, chama eww-open-in-new-buffercom os URLs inseridos anteriormente ou termos de pesquisa como o único URI sugerido, para que o comando não faça birra.

Este comando funcionará dentro e sem os buffers EWW, portanto, ele pode atuar como um substituto para o padrão eww-open-in-new-buffer, se você preferir:

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

De qualquer forma, você pode invocá-lo de qualquer lugar M-xmy-eww-new-bufferRETou vinculá-lo globalmente a uma chave mais conveniente.

Manjericão
fonte
0

Estendi um trecho do RP Dillon . O que o torna um bom candidato para criar alias como (defalias 'w #'af/eww)e abrir eww usando a função abaixo. A única diferença é a verificação condicional, se o *eww*buffer já existir, um novo será criado, se o nativo não ewwfor chamado.

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

Eu uso o Emacs 25.1 e a eww-open-in-new-bufferfunção não está lá. Portanto, tenho que renomear o buffer eww em que estou, geralmente com algum título fácil sobre a página em que estou, e chamando novamente ewwde qualquer outro buffer aberto no Emacs (por exemplo, no modo de buffer ou nos buffers direcionados, do zero, outro documento, qualquer) me leva a outro buffer eww. Finalmente, vou Spara a lista de buffers eww para selecionar a partir daí. Estranho, mas funciona, e com alguns passos. Eu me pergunto por que eww-newnão foi incorporado desde o início. Claro que é mais limpo com o código acima, vou tentar. Fico feliz em ver que a função foi adicionada no Emacs 26.

techapu
fonte
No Emacs 27, chamar ewwcom um argumento de prefixo agora cria um novo buffer EWW; veja minha resposta acima.
Basil
Se você não deseja inventar um novo nome de buffer, vá em M-x rename-uniquely.
Stefan
Obrigado Stefan pela dica. Eu tenho o Debian 9 e estou muito longe do Emacs 27 :(
techapu 02/04/19
De qualquer forma, vou ter que atualizar meu Emacs, uso o navegador embutido o tempo todo. E o w3m interrompe meu fluxo com as guias. Eww é prático e é tudo que eu preciso. Esse recurso é realmente importante, graças ao Basil pela atualização, o comando personalizado que você compartilha parece uma alternativa inteligente ao comportamento padrão. Eu ando entre os arquivos organizacionais, os buffers de informações, os terminais e o navegador eww o tempo todo e seria bom ter o eww em mãos sem ocultar a página anterior.
techapu
@ Stefan, o problema que vejo com essa solução é que preciso saber o que está no buffer, por isso volto mais tarde. Qual seria a saída de renomeação exclusiva?
techapu