Emacs fügt im visuellen Modus von Evil nicht bei jeder Zwischenablage des Betriebssystems ein

19

Installieren:

GUI-Version GNU Emacs 25.0.50.1 (x86_64-w64-mingw32) vom 25.07.2015 auf KAEL Aus EmacsW64 kompiliert.

Package Evil, mit der neuesten Version von Evil von MELPA

Windows 7 x 64-Bit.

Lage:

Getestet mit leerer Emacs-Konfiguration, bei der nur Evil aktiviert ist. Ich kopiere Text aus einer Windows-Anwendung. Dann füge ich es in Emacs hinein normal modemit p. Ich sehe den Text.

Dann wechsle ich zur Windows-Anwendung, wähle einen anderen Text aus und kopiere ihn. Wechseln Sie zurück zu Emacs, wählen Sie den Text visuell aus und fügen Sie ihn ein visual mode. Der Text in der Region wird jedoch nicht durch den Text aus der Windows-Zwischenablage ersetzt.

Dies ist nicht mit der Standardeinstellung Vim. Wie kann ich konfigurieren, dass der visuelle Text durch die letzte Kopieraktion ersetzt wird, in diesem Fall die Windows-Zwischenablage?

ReneFroger
quelle
1
Mir sind beide Themen bekannt, aber ich denke, dass sie eher mit dem Bösen zusammenhängen als mit der Zwischenablage. Die Zwischenablage funktioniert im normalen Modus einwandfrei. Und nicht für den visuellen Modus.
ReneFroger
Ah, ich verstehe, was du sagst. Für das, was es wert ist, ist es nicht Windows-spezifisch: Es wird auch nicht aus der Zwischenablage des Betriebssystems im visuellen Zustand unter Linux gezogen (Fedora, wenn es darauf ankommt).
Dan
Vielen Dank für das Update. Ich habe den Titel so geändert, dass er nicht betriebssystemspezifisch ist.
ReneFroger
Ist das nur ein böser Bug? Kannst du das melden?
PythonNut

Antworten:

28

Hier gibt es keinen Bug . Da ich mich auch über dieses Verhalten geärgert habe, habe ich nur Bösen Code gelesen, um herauszufinden, warum dies geschieht. Hier ist also eine direkte Kopie / Einfügung des gut kommentierten Einzeilers aus meiner Emacs-Konfiguration, die dieses Problem behebt:

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

Der letzte Satz ist die Antwort auf die Frage, wie man " konfiguriert, dass der visuelle Text durch die letzte Kopieraktion ersetzt wird, in diesem Fall die Windows-Zwischenablage? "

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

Genießen.

Alexander Shukaev
quelle
Danke Alexander, mir hat auch dein kompilierter Harroogan-Emac gefallen. Netter Fund, ich habe deine Antwort als die richtige markiert. Wie es scheint, kann ich nur ohne Kopfgeld dafür stimmen und es als richtig markieren. Was traurig ist, du hast es wirklich verdient. :-)
ReneFroger
1
Mann, dieser Käfer! Es ärgerte mich so sehr, dass ich zurück zu vim wechselte, um dieses Verhalten loszuwerden. Ich habe überall gesucht und mich auch beim bösen Verfolger gemeldet, aber leider hat niemand auf mein Problem geantwortet. Alexander, du bist mein Held!
DVCRN
1
NETT! Dies sollte eine Standardeinstellung in Spacemacs sein.
Justingordon
Es scheint hinterhältig zu sein, wie dieses Verhalten standardmäßig aktiviert ist. Ich habe eine Weile gebraucht, um zu erkennen, was passiert ist und dass es keine Möglichkeit gibt, es über das Setzen einer Variablen zu deaktivieren. Diese Problemumgehung funktioniert gut :)
Jorge Israel Peña