Emacs ne colle pas en mode visuel du mal avec tous les presse-papiers du système d'exploitation

19

Installer:

Version GUI GNU Emacs 25.0.50.1 (x86_64-w64-mingw32) du 2015-07-25 sur KAEL Compilé à partir d'EmacsW64.

Package Evil, utilisant la dernière version de Evil de MELPA

Windows 7 x64 bits.

Situation:

Testé avec une configuration Emacs vide avec seulement Evil activé. Je copie du texte depuis l'application Windows. Ensuite, je le colle dans Emacs à l'intérieur normal modeavec p. Je vois le texte.

Je passe ensuite à l'application Windows, sélectionne un autre texte, le copie. Revenez à Emacs, sélectionnez visuellement le texte et collez-le à l'intérieur visual mode. Mais le texte à l'intérieur de la région ne sera pas remplacé par le texte du presse-papiers de Windows.

Ce n'est pas le cas avec le Vim par défaut. Comment pourrais-je le configurer, pour que le texte visuel soit remplacé par la dernière action de copie, dans ce cas le presse-papiers Windows?

ReneFroger
la source
1
Je connais les deux sujets, mais je pense que c'est plus lié au mal qu'au presse-papiers. La fonction presse-papiers fonctionne très bien en mode normal. Et pas pour le mode visuel.
ReneFroger
Ah, je vois ce que tu dis. Pour ce que ça vaut, ce n'est pas spécifique à Windows: il ne tire pas non plus du presse-papiers du système d'exploitation à l'état visuel sur Linux (Fedora, si cela importe).
Dan
Merci pour la mise à jour, j'ai changé le titre pour ne pas être spécifique au système d'exploitation.
ReneFroger
Est-ce simplement un bug Evil? Avez-vous une chance de le signaler?
PythonNut

Réponses:

28

Il n'y a pas de bug ici. Étant donné que j'étais également ennuyé par ce comportement, je viens de lire le code Evil pour savoir pourquoi cela se produit. Donc, voici un simple copier / coller du one-liner bien commenté de ma configuration Emacs qui résout ce problème:

;; 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 dernière phrase est la réponse à la question de savoir comment "le configurer, que le texte visuel soit remplacé par la dernière action de copie, dans ce cas le presse-papiers Windows? "

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

Prendre plaisir.

Alexander Shukaev
la source
Merci Alexander, j'ai également apprécié Emacs de Harroogan. Belle trouvaille, j'ai marqué votre réponse comme étant la bonne. Comme il semble, je ne peux que voter positivement et le marquer comme bon sans aucune prime. C'est triste, tu le méritais vraiment. :-)
ReneFroger
1
Man ce bug! Cela m'a énervé à ce point que je suis revenu à vim juste pour me débarrasser de ce comportement. J'ai cherché partout et j'ai également signalé au mauvais traqueur, mais malheureusement, personne n'a répondu à mon problème. Alexander, tu es mon héros!
dvcrn du
1
AGRÉABLE! Cela devrait être une valeur par défaut dans spacemacs.
justingordon
Il semble sournois comment ce comportement est activé par défaut. Cela m'a pris un certain temps pour comprendre ce qui se passait et le fait qu'il n'y avait aucun moyen de le désactiver via la définition d'une variable. Cette solution de contournement fonctionne bien :)
Jorge Israel Peña