Emacs ไม่ได้อยู่ในโหมด Visual ของ Evil กับคลิปบอร์ดของระบบปฏิบัติการทุกอัน


19

ติดตั้ง:

GUI รุ่น GNU Emacs 25.0.50.1 (x86_64-w64-mingw32) ปี 2015-07-25 บน KAEL รวบรวมจาก EmacsW64

Package Evil ใช้ Evil เวอร์ชันล่าสุดจาก MELPA

Windows 7 x64 บิต

สถานการณ์:

ทดสอบด้วยการกำหนดค่า Emacs ว่างเปล่าที่เปิดใช้งาน Evil เท่านั้น ฉันคัดลอกข้อความบางส่วนจากแอปพลิเคชัน Windows จากนั้นผมวางลงภายใน Emacs ด้วยnormal mode pฉันเห็นข้อความ

จากนั้นฉันเปลี่ยนเป็นแอปพลิเคชัน Windows เลือกข้อความอื่นคัดลอก สลับกลับไป Emacs visual modeสายตาเลือกข้อความและวางภายใน แต่ข้อความภายในภูมิภาคจะไม่ถูกแทนที่ด้วยข้อความจากคลิปบอร์ดของ Windows

นี่ไม่ใช่ Vim เริ่มต้น ฉันจะกำหนดค่าข้อความที่ถูกแทนที่ด้วยแอคชันการคัดลอกล่าสุดได้อย่างไรในกรณีนี้คลิปบอร์ด Windows



1
ฉันรู้ทั้งสองหัวข้อ แต่ฉันคิดว่ามันเกี่ยวกับความชั่วร้ายยิ่งกว่าคลิปบอร์ด ฟังก์ชั่นคลิปบอร์ดทำงานได้ดีในโหมดปกติ และไม่ใช่สำหรับโหมดภาพ
ReneFroger

อาฉันเห็นสิ่งที่คุณพูด สำหรับสิ่งที่คุ้มค่าไม่ใช่เฉพาะ Windows: มันไม่ได้งัดจากคลิปบอร์ดของ OS ในสถานะภาพบน Linux (Fedora ถ้ามันสำคัญ)
แดน

ขอบคุณสำหรับการอัปเดตฉันเปลี่ยนชื่อเป็นไม่เฉพาะสำหรับระบบปฏิบัติการ
ReneFroger

นี่เป็นเพียงข้อผิดพลาดธรรมดา ๆ เหรอ? โอกาสใดที่คุณสามารถรายงานได้
PythonNut

คำตอบ:


28

ไม่มีข้อผิดพลาดที่นี่ ตั้งแต่ฉันยังรำคาญกับพฤติกรรมนี้ฉันเพิ่งอ่าน Evil code เพื่อค้นหาสาเหตุที่เกิดขึ้น ดังนั้นนี่คือสำเนาตรง / วางของซับความเห็นที่ดีจากการกำหนดค่า Emacs ของฉันที่แก้ไขปัญหานี้:

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

ประโยคสุดท้ายคือคำตอบสำหรับคำถามของวิธีการ " กำหนดค่าว่าข้อความที่เห็นได้รับการแทนที่ด้วยการกระทำการคัดลอกล่าสุดในกรณีนี้คลิปบอร์ด Windows? "

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

สนุก.


ขอบคุณอเล็กซานเดอร์ฉันยังสนุกกับ Emac ของ Harroogan ที่คุณรวบรวม ฉันพบว่าฉันทำเครื่องหมายคำตอบของคุณว่าเหมาะสม ดูเหมือนว่าฉันสามารถ upvote เท่านั้นและทำเครื่องหมายว่าถูกต้องโดยไม่มีความโปรดปรานใด ๆ ซึ่งน่าเศร้าคุณสมควรได้รับมันจริงๆ :-)
ReneFroger

1
จัดการกับข้อบกพร่องนี้! มันทำให้ฉันรำคาญมากจนฉันเปลี่ยนกลับไปเป็นกลุ่มเพื่อกำจัดพฤติกรรมนี้ ฉันค้นหาทุกที่และรายงานไปยังตัวติดตามความชั่วร้าย แต่น่าเสียดายที่ไม่มีใครตอบปัญหาของฉัน อเล็กซานเดอร์คุณคือฮีโร่ของฉัน!
dvcrn

1
NICE! นี่ควรเป็นค่าเริ่มต้นใน spacemacs
justingordon

ดูเหมือนว่ามีลักษณะไม่แน่นอนว่าการทำงานนี้เป็นค่าเริ่มต้น เอาฉันสักครู่เพื่อรับรู้สิ่งที่เกิดขึ้นและความจริงที่ว่าไม่มีวิธีปิดการใช้งานผ่านการตั้งค่าตัวแปร วิธีแก้ปัญหานี้ใช้งานได้ดี :)
Jorge Israel Peña
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.