Como empurrar as pranchetas do sistema para matar o conteúdo do anel em tempo real quando copio fora do emacs?

8

Percebi que quando copio uma coisa fora do Emacs, a coisa não parece matar o anel imediatamente, exceto que eu o puxo para o Emacs. Se eu copiar duas vezes, apenas a última cópia poderá ser obtida pelo arranco.

Às vezes, eu gostaria de enviar as cópias das pranchetas do sistema para matar o anel depois de fazer a cópia. Depois disso, posso selecionar o que eu preciso no anel matador para colar no Emacs. Então, como posso conseguir que as cópias possam ser empurradas para o anel de morte muitas vezes?

Estou no Windows 7.

Leu_Grady
fonte

Respostas:

5

TL; DR: você pode usar clipmondisponível no MELPA e ativar clipmon-mode.

Nota: os detalhes abaixo se aplicam aos servidores X, mas o pacote deve funcionar em qualquer plataforma.

Como a área de transferência funciona? A área de transferência é implementada como um processo assíncrono. Quando você copia de um aplicativo, ele se torna o "proprietário da área de transferência", mas na verdade não coloca os dados copiados em nenhum lugar. Quando você cola em um aplicativo, ele solicita os dados do "proprietário da área de transferência" atual.

Referência: http://www.jwz.org/doc/x-cut-and-paste.html

Como obter o conteúdo da área de transferência Pelo que entendi, a maneira "confiável" de verificar se há novos dados na área de transferência é pesquisar periodicamente o servidor X para verificar o que está lá. Para o emacs, o pacote clipmon ( https://github.com/bburns/clipmon ) faz isso. A cada dois segundos, por padrão.

Trecho do README:

Ele também adiciona alterações na área de transferência do sistema ao anel de morte, transformando o Emacs em um gerenciador de área de transferência para texto - você pode usar um pacote como procurar-matar-anel ou anel de leme para visualizar e gerenciar o histórico da área de transferência.

(Observe que eu realmente não tentei este pacote, mas certamente parece uma solução.)

YoungFrog
fonte
3

Não tenho certeza de que é possível que o texto copiado apareça em seu ringue imediatamente após a cópia, a menos que haja alguma maneira de executar um gancho na cópia. Obviamente, isso dependeria do seu sistema operacional / ambiente, mas eu queria mencionar que você pode tentar configurar

(setq save-interprogram-paste-before-kill t)

O que preservará, pelo menos, o texto copiado do sistema operacional quando algo for copiado do emacs.


De C-h v save-interprogram-paste-before-kill:

Salve as strings da área de transferência no kill ring antes de substituí-las.

Quando alguém seleciona algo em outro programa para colá-lo no Emacs, mas mata algo no Emacs antes de realmente colá-lo, essa seleção desaparece, a menos que essa variável seja nula; nesse caso, a seleção do outro programa é salva kill-ring antes do Emacs matar e ainda é possível colá-lo usando C-y M-y.

Imalison
fonte
Sim, essa variável pode fazer exatamente o que você disse. Mas não estou apenas pedindo isso, quero que o anel de morte possa salvar uma cópia fora do Emacs depois de copiar.
Leu_Grady
2

Finalmente, descobri uma solução desajeitada, que se referia ao conceito de clipmon. Mas muito simples com o código de uma linha:

(run-at-time 0 3 (lambda () (interactive) (current-kill 0)))

O anel de morte será sincronizado a cada 3 segundos com a área de transferência do sistema. Claro que você pode alterar o intervalo para um valor ainda menor.

PS: A razão pela qual eu preciso dessa funcionalidade é que desejo definir um comando que possa ser chamado com argumentos do que copiei externamente.

Obrigado pelas respostas de @kaushalmodi e @YoungFrog.

Leu_Grady
fonte