Emacs nie wkleja się w trybie Visual Evil z każdym schowkiem systemu operacyjnego

19

Ustawiać:

Wersja GUI GNU Emacs 25.0.50.1 (x86_64-w64-mingw32) z 2015-07-25 na KAEL Kompilacja z EmacsW64.

Pakiet Evil, używając najnowszej wersji Evil firmy MELPA

Windows 7 x64 bit.

Sytuacja:

Testowany z pustą konfiguracją Emacsa z włączonym tylko Evilem. Kopiuję tekst z aplikacji Windows. Następnie wklej go do wewnątrz Emacsa normal modez p. Widzę tekst.

Następnie przełączam się na aplikację Windows, wybieram inny tekst, kopiuję go. Przełącz się z powrotem na Emacsa, wizualnie zaznacz tekst i wklej do środka visual mode. Ale tekst w regionie nie zostanie zastąpiony tekstem ze schowka Windows.

Nie dotyczy to domyślnego Vima. Jak mogę to skonfigurować, aby tekst wizualnie został zastąpiony najnowszą operacją kopiowania, w tym przypadku schowkiem systemu Windows?

ReneFroger
źródło
1
Jestem świadomy obu tematów, ale myślę, że jest to bardziej związane ze złem niż ze schowkiem. Funkcja schowka działa dobrze w trybie normalnym. I nie w trybie wizualnym.
ReneFroger
Ach, rozumiem co mówisz. Co jest warte, nie jest specyficzne dla systemu Windows: nie szarpnie również ze schowka systemu operacyjnego w stanie wizualnym w systemie Linux (Fedora, jeśli ma to znaczenie).
Dan
Dzięki za aktualizację zmieniłem tytuł, aby nie był specyficzny dla systemu operacyjnego.
ReneFroger
Czy to tylko zwykły błąd zła? Czy masz szansę to zgłosić?
PythonNut

Odpowiedzi:

28

Tu nie ma błędu . Ponieważ byłem zirytowany tym zachowaniem, po prostu przeczytałem kod zła, aby dowiedzieć się, dlaczego tak się dzieje. Oto prosta kopia / wklej dobrze skomentowanego linijki z mojej konfiguracji Emacsa, która rozwiązuje ten problem:

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

Ostatnie zdanie jest odpowiedzią na pytanie, jak „ skonfigurować, aby tekst wizualnie został zastąpiony najnowszą operacją kopiowania, w tym przypadku schowkiem systemu Windows?

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

Cieszyć się.

Alexander Shukaev
źródło
Dzięki Alexander, podobało mi się również twoje skompilowane Emacsa Harroogana. Niezłe znalezisko, zaznaczyłem twoją odpowiedź jako właściwą. Jak się wydaje, mogę jedynie głosować i oznaczyć to jako słuszne bez żadnej nagrody. Co jest smutne, naprawdę na to zasłużyłeś. :-)
ReneFroger
1
Obsługuj ten błąd! Denerwowało mnie do tego stopnia, że ​​wróciłem do vima, aby pozbyć się tego zachowania. Szukałem wszędzie i również zgłosiłem się do trackera zła, ale niestety nikt nie odpowiedział na mój problem. Alexander, jesteś moim bohaterem!
dvcrn
1
ŁADNY! To powinno być domyślne w znakach kosmicznych.
justingordon
Domyślnie wydaje się podstępne, jak to zachowanie jest włączone. Zajęło mi trochę czasu, aby zrozumieć, co się dzieje, oraz fakt, że nie ma sposobu, aby to wyłączyć poprzez ustawienie zmiennej. To obejście działa dobrze :)
Jorge Israel Peña