O Emacs não cola no modo Visual do Mal em todas as áreas de transferência do SO

19

Configuração:

Versão da GUI GNU Emacs 25.0.50.1 (x86_64-w64-mingw32) de 25/07/2015 no KAEL Compilado a partir do EmacsW64.

Pacote Evil, usando a versão mais recente do Evil da MELPA

Windows 7 x 64 bits.

Situação:

Testado com a configuração vazia do Emacs, apenas com o Evil ativado. Eu copio algum texto do aplicativo Windows. Depois colo no Emacs dentro normal modecom p. Eu vejo o texto.

Então eu mudo para o aplicativo do Windows, selecione outro texto, copie-o. Volte para o Emacs, selecione visualmente o texto e cole dentro visual mode. Mas o texto dentro da região não será substituído pelo texto da área de transferência do Windows.

Isso não é com o Vim padrão. Como posso configurá-lo, para que o texto visual seja substituído pela última ação de cópia, neste caso a área de transferência do Windows?

ReneFroger
fonte
1
Estou ciente dos dois tópicos, mas acho que é mais relacionado ao mal do que à área de transferência. A função da área de transferência funciona bem no modo normal. E não para o modo visual.
ReneFroger
Ah, entendo o que você está dizendo. Pelo que vale, não é específico do Windows: ele também não arranca da área de transferência do SO no estado visual no Linux (Fedora, se for o caso).
Dan
Obrigado pela atualização, mudei o título para não ser específico do SO.
ReneFroger
Isso é apenas um simples bug do mal? Alguma chance de denunciá-lo?
precisa saber é o seguinte

Respostas:

28

Não há bug aqui. Como também fiquei irritado com esse comportamento, acabei de ler o código Evil para descobrir por que isso está acontecendo. Então, aqui está uma cópia / pasta direta do one-liner bem comentado da minha configuração do Emacs que corrige esse problema:

;; Imagine the following scenario.  One wants to paste some previously copied
;; (from application other than Emacs) text to the system's clipboard in place
;; of some contiguous block of text in a buffer.  Hence, one switches to
;; `evil-visual-state' and selects the corresponding block of text to be
;; replaced.  However, one either pastes some (previously killed) text from
;; `kill-ring' or (if `kill-ring' is empty) receives the error: "Kill ring is
;; empty"; see `evil-visual-paste' and `current-kill' respectively.  The
;; reason why `current-kill' does not return the desired text from the
;; system's clipboard is because `evil-visual-update-x-selection' is being run
;; by `evil-visual-pre-command' before `evil-visual-paste'.  That is
;; `x-select-text' is being run (by `evil-visual-update-x-selection') before
;; `evil-visual-paste'.  As a result, `x-select-text' copies the selected
;; block of text to the system's clipboard as long as
;; `x-select-enable-clipboard' is non-nil (and in this scenario we assume that
;; it is).  According to the documentation of `interprogram-paste-function',
;; it should not return the text from the system's clipboard if it was last
;; provided by Emacs (e.g. with `x-select-text').  Thus, one ends up with the
;; problem described above.  To solve it, simply make
;; `evil-visual-update-x-selection' do nothing:
;; (fset 'evil-visual-update-x-selection 'ignore)

A última frase é a resposta à pergunta de como " configurá-lo, para que o texto visual seja substituído pela última ação de cópia, neste caso a área de transferência do Windows? "

(fset 'evil-visual-update-x-selection 'ignore)

Apreciar.

Alexander Shukaev
fonte
Obrigado Alexander, eu também gostei do Emacs do Harroogan compilado. Bom achado, marquei sua resposta como a correta. Como parece, só posso votar e marcá-lo como correto, sem qualquer recompensa. O que é triste, você realmente mereceu. :-)
ReneFroger 26/08/15
1
Cara esse bug! Me irritou a esse ponto que eu voltei para o vim apenas para me livrar desse comportamento. Eu procurei em todos os lugares e também relatei ao rastreador do mal, mas infelizmente ninguém respondeu ao meu problema. Alexander, você é meu herói!
dvcrn
1
LEGAIS! Esse deve ser o padrão no spacemacs.
justingordon
Parece sorrateiro como esse comportamento é ativado por padrão. Demorei um pouco para perceber o que estava acontecendo e o fato de que não há como desabilitá-lo através da definição de uma variável. Esta solução alternativa funciona bem :)
Jorge Israel Peña