Làm cách nào để đẩy các clipboard của hệ thống để tiêu diệt nội dung vòng trong thời gian thực khi tôi sao chép bên ngoài emacs?


8

Tôi nhận thấy rằng khi tôi sao chép thứ bên ngoài Emacs, thứ đó dường như không giết chết chiếc nhẫn ngay lập tức trừ khi tôi đưa nó cho Emacs. Nếu tôi sao chép hai lần, chỉ có thể nhận được bản sao cuối cùng.

Đôi khi, tôi muốn đẩy các bản sao từ các bảng hệ thống để giết nhẫn sau khi tôi thực hiện sao chép. Sau đó, tôi có thể chọn những gì tôi cần trong vòng kill để dán vào Emacs. Vậy làm thế nào tôi có thể đạt được rằng các bản sao có thể bị đẩy vào vòng giết nhiều lần?

Tôi đang dùng Windows 7.

Câu trả lời:


5

TL; DR: bạn có thể sử dụng clipmoncó sẵn trên MELPA và bật clipmon-mode.

Lưu ý: các chi tiết bên dưới áp dụng cho máy chủ X, nhưng gói nên hoạt động trên mọi nền tảng.

Làm thế nào để clipboard hoạt động? Clipboard được thực hiện như một quy trình không đồng bộ. Khi bạn sao chép từ một ứng dụng, nó sẽ trở thành "chủ sở hữu clipboard" nhưng thực tế không đặt dữ liệu được sao chép ở bất cứ đâu. Khi bạn dán vào một ứng dụng, nó sẽ yêu cầu dữ liệu từ "chủ sở hữu clipboard" hiện tại.

Tham khảo: http://www.jwz.org/doc/x-cut-and-paste.html

Cách lấy nội dung của bảng tạm Theo tôi hiểu, cách "đáng tin cậy" để xem liệu có dữ liệu mới trong bảng tạm là kiểm tra định kỳ máy chủ X để kiểm tra xem có gì không. Đối với emacs, gói clipmon ( https://github.com/bburns/clipmon ) thực hiện điều đó. Cứ hai giây theo mặc định.

Trích từ README:

Nó cũng thêm các thay đổi vào bảng tạm hệ thống vào vòng khử, biến Emacs thành trình quản lý bảng tạm cho văn bản - sau đó bạn có thể sử dụng gói như duyệt-kill-ring hoặc helm-ring để xem và quản lý lịch sử clipboard của mình.

(Xin lưu ý rằng tôi đã không thực sự thử gói này, nhưng nó chắc chắn trông giống như một giải pháp.)


3

Tôi không chắc chắn rằng có thể có văn bản sao chép xuất hiện trong vòng giết của bạn ngay sau khi sao chép, trừ khi có một cách nào đó để chạy hook trên bản sao. Điều này rõ ràng sẽ phụ thuộc vào hệ điều hành / môi trường của bạn, nhưng tôi đã muốn đề cập rằng bạn có thể muốn thử cài đặt

(setq save-interprogram-paste-before-kill t)

Điều này ít nhất sẽ bảo tồn văn bản sao chép từ hệ điều hành khi một cái gì đó được sao chép từ bên trong emacs.


Từ C-h v save-interprogram-paste-before-kill:

Lưu chuỗi clipboard vào vòng kill trước khi thay thế chúng.

Khi một người chọn thứ gì đó trong chương trình khác để dán nó vào Emacs, nhưng sẽ giết thứ gì đó trong Emacs trước khi thực sự dán nó, lựa chọn này sẽ biến mất trừ khi biến này không phải là con số không, trong trường hợp đó, lựa chọn của chương trình kia được lưu vào kill-ring trước khi giết Emacs và người ta vẫn có thể dán nó bằng cách sử dụng C-y M-y.


Vâng, biến này có thể làm chính xác những gì bạn nói. Nhưng tôi không chỉ yêu cầu điều đó, tôi muốn chiếc nhẫn kill có thể lưu bản sao bên ngoài Emacs sau khi tôi sao chép.
Leu_Grady

2

Cuối cùng tôi đã tìm ra một giải pháp vụng về, trong đó đề cập đến khái niệm clipmon. Nhưng rất đơn giản với mã của một dòng:

(run-at-time 0 3 (lambda () (interactive) (current-kill 0)))

Vòng khử sẽ được đồng bộ hóa cứ sau 3 giây với bảng tạm hệ thống. Tất nhiên bạn có thể thay đổi khoảng thời gian thành một giá trị thậm chí nhỏ hơn.

PS: Lý do tại sao tôi cần chức năng này là vì tôi muốn xác định một lệnh có thể được gọi với các đối số của những gì tôi đã sao chép bên ngoài.

Cảm ơn phản hồi từ @kaushalmodi và @YoungFrog.

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.