Emacs không dán trong chế độ Visual Evil với mọi bảng tạm của hệ điều hành


19

Thiết lập:

GUI phiên bản GNU Emacs 25.0.50.1 (x86_64-w64-mingw32) của 2015-07-25 trên KAEL Được biên dịch từ EmacsW64.

Gói Evil, sử dụng phiên bản Evil mới nhất từ ​​MELPA

Windows 7 x64 bit.

Tình hình:

Đã thử nghiệm với cấu hình Emacs trống khi chỉ bật Evil. Tôi sao chép một số văn bản từ ứng dụng Windows. Sau đó, tôi dán nó vào Emacs bên normal modevới p. Tôi thấy văn bản.

Sau đó, tôi chuyển sang ứng dụng Windows, chọn một văn bản khác, sao chép nó. Chuyển về Emacs, chọn trực quan văn bản và dán bên trong visual mode. Nhưng văn bản trong khu vực sẽ không được thay thế bằng văn bản từ bảng tạm của Windows.

Đây không phải là với Vim mặc định. Làm cách nào tôi có thể định cấu hình nó, rằng văn bản trực quan được thay thế bằng hành động sao chép mới nhất, trong trường hợp này là bảng tạm Windows?



1
Tôi biết cả hai chủ đề, nhưng tôi nghĩ nó liên quan đến Evil nhiều hơn so với clipboard. Chức năng clipboard hoạt động tốt trong chế độ bình thường. Và không cho chế độ trực quan.
ReneFroger

Ah, tôi thấy những gì bạn đang nói. Đối với những gì nó có giá trị, nó không dành riêng cho Windows: nó cũng không được lấy từ bảng tạm của hệ điều hành ở trạng thái trực quan trên Linux (Fedora, nếu có vấn đề).
Dân

Cảm ơn đã cập nhật, tôi đã thay đổi tiêu đề thành không dành riêng cho hệ điều hành.
ReneFroger

Đây có phải chỉ là một lỗi Evil đơn giản? Bất kỳ cơ hội bạn có thể báo cáo nó?
PythonNut

Câu trả lời:


28

Không có lỗi ở đây. Vì tôi cũng khó chịu với hành vi này, tôi chỉ đọc mã Evil để tìm hiểu lý do tại sao điều này xảy ra. Vì vậy, đây là một bản sao / dán thẳng của một lớp lót được nhận xét tốt từ cấu hình Emacs của tôi để khắc phục vấn đề này:

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

Câu cuối cùng là câu trả lời cho câu hỏi làm thế nào để " cấu hình nó, rằng văn bản trực quan được thay thế bằng hành động sao chép mới nhất, trong trường hợp này là bảng tạm Windows? "

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

Thưởng thức.


Cảm ơn Alexander, tôi cũng rất thích Emacs do Harroogan biên soạn. Tìm thấy tốt, tôi đánh dấu câu trả lời của bạn là đúng. Có vẻ như, tôi chỉ có thể nâng cấp và đánh dấu nó là đúng mà không có tiền thưởng. Điều đó thật đáng buồn, bạn thực sự xứng đáng với điều đó. :-)
ReneFroger

1
Con người lỗi này! Nó làm tôi bực mình đến mức độ mà tôi quay lại vim chỉ để thoát khỏi hành vi này. Tôi đã tìm kiếm khắp nơi và cũng báo cáo cho kẻ theo dõi độc ác nhưng thật đáng buồn là không ai phản hồi về vấn đề của tôi. Alexander, anh là người hùng của tôi!
dvcrn

1
TỐT ĐẸP! Điều này nên được mặc định trong spacemacs.
justingordon

Có vẻ như lén lút cách hành vi này được bật theo mặc định. Mất một lúc tôi mới nhận ra chuyện gì đang xảy ra, và thực tế là không có cách nào để vô hiệu hóa nó thông qua việc đặt một biến. Cách giải quyết này hoạt động tốt :)
Jorge Israel Peña
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.