Emacs no pega en el modo Visual de Evil con cada portapapeles del sistema operativo

19

Preparar:

Versión GUI GNU Emacs 25.0.50.1 (x86_64-w64-mingw32) del 25/07/2015 en KAEL Compilado de EmacsW64.

Package Evil, utilizando la última versión de Evil de MELPA

Windows 7 x64 bit.

Situación:

Probado con la configuración de Emacs vacía con solo Evil habilitado. Copio texto de la aplicación de Windows. Luego lo pego en Emacs adentro normal modecon p. Veo el texto

Luego cambio a la aplicación de Windows, selecciono otro texto, lo copio. Vuelva a Emacs, seleccione visualmente el texto y péguelo dentro visual mode. Pero el texto dentro de la región no se reemplazará con el texto del portapapeles de Windows.

Esto no es con el Vim predeterminado. ¿Cómo podría configurarlo para que el texto visual sea reemplazado por la última acción de copia, en este caso el portapapeles de Windows?

ReneFroger
fuente
1
Soy consciente de ambos temas, pero creo que está más relacionado con el mal que con el portapapeles. La función del portapapeles funciona bien dentro del modo normal. Y no para el modo visual.
ReneFroger
Ah, ya veo lo que estás diciendo. Por lo que vale, no es específico de Windows: tampoco se extrae del portapapeles del sistema operativo en estado visual en Linux (Fedora, si es importante).
Dan
Gracias por la actualización, cambié el título para que no sea específico del sistema operativo.
ReneFroger
¿Es esto simplemente un error Evil? ¿Alguna posibilidad de que puedas denunciarlo?
PythonNut

Respuestas:

28

No hay error aquí. Como también estaba molesto con este comportamiento, acabo de leer el código Evil para descubrir por qué sucede esto. Entonces, aquí hay una copia / pegado directo de una línea bien comentada de mi configuración de Emacs que soluciona este 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)

La última oración es la respuesta a la pregunta de cómo " configurarlo, para que el texto visual sea reemplazado por la última acción de copia, en este caso, el portapapeles de Windows ".

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

Disfrutar.

Alexander Shukaev
fuente
Gracias Alexander, también disfruté de tu Erocs de Harroogan compilado. Buen descubrimiento, marqué su respuesta como la correcta. Como parece, solo puedo votar y marcarlo como correcto sin ninguna recompensa. Lo cual es triste, realmente lo merecías. :-)
ReneFroger
1
Hombre este error! Me molestó hasta ese punto que volví a vim solo para deshacerme de este comportamiento. Busqué en todas partes y también informé al malvado rastreador, pero lamentablemente nadie respondió a mi problema. Alexander, eres mi héroe!
dvcrn
1
¡BONITO! Esto debería ser un valor predeterminado en spacemacs.
justingordon
Parece astuto cómo está activado este comportamiento por defecto. Me tomó un tiempo darme cuenta de lo que estaba sucediendo y el hecho de que no hay forma de deshabilitarlo configurando una variable. Esta solución funciona bien :)
Jorge Israel Peña