Emacs tidak menempel di mode Visual Evil dengan setiap papan klip OS

19

Mempersiapkan:

Versi GUI GNU Emacs 25.0.50.1 (x86_64-w64-mingw32) dari 2015-07-25 di KAEL Dikompilasi dari EmacsW64.

Package Evil, menggunakan versi terbaru Evil dari MELPA

Windows 7 x64 bit.

Situasi:

Diuji dengan konfigurasi Emacs kosong dengan hanya Jahat yang diaktifkan. Saya menyalin beberapa teks dari aplikasi Windows. Lalu aku menempelkannya ke dalam Emacs normal modedengan p. Saya melihat teksnya.

Lalu saya beralih ke aplikasi Windows, pilih teks lain, salin. Beralih kembali ke Emacs, pilih teks secara visual, dan rekatkan di dalamnya visual mode. Tetapi teks di dalam wilayah tidak akan diganti dengan teks dari clipboard Windows.

Ini bukan dengan Vim default. Bagaimana saya bisa mengkonfigurasinya, bahwa teks visual akan diganti oleh tindakan copy terbaru, dalam hal ini clipboard Windows?

ReneFroger
sumber
1
Saya mengetahui kedua topik tersebut, tetapi saya pikir ini lebih terkait Jahat daripada clipboard. Fungsi clipboard berfungsi dengan baik di dalam mode normal. Dan tidak untuk mode visual.
ReneFroger
Ah, aku mengerti apa yang kamu katakan. Untuk apa nilainya, ini bukan khusus Windows: itu juga tidak menarik dari clipboard OS dalam keadaan visual di Linux (Fedora, jika itu penting).
Dan
Terima kasih atas pembaruannya, saya mengubah judul menjadi tidak spesifik OS.
ReneFroger
Apakah ini sekadar bug Jahat? Apakah ada kemungkinan Anda dapat melaporkannya?
PythonNut

Jawaban:

28

Tidak ada bug di sini. Karena saya juga terganggu dengan perilaku ini, saya baru saja membaca kode Evil untuk mencari tahu mengapa ini terjadi. Jadi, berikut ini adalah salinan / tempel langsung dari one-liner yang dikomentari dengan baik dari konfigurasi Emacs saya yang memperbaiki masalah ini:

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

Kalimat terakhir adalah jawaban untuk pertanyaan tentang bagaimana " mengkonfigurasinya, bahwa teks visual akan digantikan oleh tindakan copy terbaru, dalam hal ini clipboard Windows? "

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

Nikmati.

Alexander Shukaev
sumber
Terima kasih Alexander, saya juga menikmati Emacs Harroogan yang Anda buat. Nice find, saya menandai jawaban Anda sebagai jawaban yang tepat. Seperti kelihatannya, saya hanya dapat memilih dan menandainya sebagai benar tanpa hadiah. Yang menyedihkan, Anda benar-benar layak mendapatkannya. :-)
ReneFroger
1
Man bug ini! Itu membuat saya kesal sampai-sampai saya beralih ke vim hanya untuk menghilangkan perilaku ini. Saya mencari kemana-mana dan juga melaporkan ke pelacak kejahatan tetapi sayangnya tidak ada yang menanggapi masalah saya. Alexander, kau adalah pahlawanku!
dvcrn
1
BAGUS! Ini harus menjadi default di spacemacs.
justingordon
Tampaknya licik bagaimana perilaku ini diaktifkan secara default. Butuh beberapa saat untuk menyadari apa yang terjadi, dan fakta bahwa tidak ada cara untuk menonaktifkannya melalui pengaturan variabel. Solusi ini berfungsi dengan baik :)
Jorge Israel Peña