Thêm clipboard hệ điều hành để giết nhẫn


25

Thường thì tôi thấy mình sao chép một đoạn mã vào bảng tạm của hệ điều hành từ internet. Sau đó, tôi thực hiện các bước đơn giản sau:

  1. Chuyển sang cửa sổ Emacs của tôi
  2. Tìm nơi tôi muốn dán mã
  3. Sử dụng C-y( yank) để chèn văn bản đã sao chép.

Tuy nhiên, đôi khi tôi thấy (với sự thất vọng lớn của mình) rằng tôi đã vô tình sử dụng một số hình thức lệnh giết (như kill-wordhoặc kill-line) trong khi tôi ở bước 2. Trong những trường hợp như vậy, văn bản được sao chép từ "clipboard" không bao giờ biến nó thành lệnh giết nhẫn.

Có cách nào để đảm bảo rằng văn bản được sao chép từ các ứng dụng khác luôn đưa nó vào vòng giết của tôi không?

Tôi làm việc trong Linux thường xuyên nhất, nhưng tôi cũng sử dụng Emacs thường xuyên trên Windows và Mac OS X, vì vậy câu trả lời không liên quan đến hệ điều hành được ưu tiên.


Tôi có thể đề nghị liên kết này ? duyệt toàn bộ trang, bạn sẽ thấy rất nhiều cách sao chép / dán khác nhau từ / vào clipboard
Nsukami _

@Nsukami_ Cảm ơn. Tôi sẽ cố gắng tiêu hóa nó, nhưng trang được liên kết là một ví dụ điển hình về lý do tại sao tôi cảm thấy mệt mỏi khi tìm kiếm câu trả lời tại EmacsWiki. Nhiều tin tặc elisp ở đó dường như nghĩ rằng mã elisp là tài liệu tự ghi và không yêu cầu bình luận, cũng như không có lời giải thích nào về chức năng hoặc cách sử dụng. Tôi thường không có thời gian để thiết kế ngược mã chỉ để quyết định xem nó có làm điều tôi muốn hay không.
nispio

haha, tôi hiểu rồi;)
Nsukami _

Câu trả lời:


31

Bạn cần tùy chỉnh save-interprogram-paste-before-killđể t. Điều này sẽ đẩy clipboard của bạn lên killring trong trường hợp bạn giết một cái gì đó trong emacs trước khi dán clipboard. Một tùy chỉnh có liên quan là yank-pop-change-selectionđẩy yank hiện tại của bạn vào bảng tạm. Để cả hai thứ này hoạt động, bạn cần x-select-enable-clipboard(được thay thế bằng gui-select-enable-clipboardtrong emacs 25.1) để được tmặc định.

Lý do điều này bị tắt theo mặc định là để ngăn chặn việc vô tình đẩy một lượng lớn dữ liệu vào việc tiêu diệt vẫn tồn tại trong suốt phiên không giống như bảng tạm dễ dàng thay thế.


1
Thậm chí sạch hơn và dễ dàng hơn tôi mong đợi. save-interprogram-paste-before-killdường như làm chính xác những gì tôi muốn!
nispio

Tôi đang ở emacs 26, và gui-select-enable-clipboardđược gọi là chỉ select-enable-clipboard.
Rune Kaagaard

3

một giải pháp khác là chỉ sử dụng công cụ cli nếu có thể,

  • pbcopy / pbpaste trên Mac

  • getclip / putclip trên Cygwin

  • xsel trên Linux
  • x-clipboard trong GUI Emacs (như những người khác đã đề cập, bạn cần bật cờ x-select-enable-clipboard).

Ưu điểm của giải pháp này là clipboard luôn có thể sử dụng được (ví dụ: khi bạn ssh từ xa).

Câu trả lời của tôi có hai phần. phần một giới thiệu một số công cụ tiện dụng để thao tác với bảng tạm. phần hai sẽ trả lời câu hỏi ban đầu của bạn (lưu clipboard vào vòng kill).

PHẦN MỘT

Chèn mã dưới đây vào ~ / .emacs của bạn:

(setq *is-a-mac* (eq system-type 'darwin))
(setq *cygwin* (eq system-type 'cygwin) )
(setq *linux* (or (eq system-type 'gnu/linux) (eq system-type 'linux)) )
(defun copy-to-x-clipboard ()
  (interactive)
  (if (region-active-p)
      (progn
        (cond
         ((and (display-graphic-p) x-select-enable-clipboard)
          (x-set-selection 'CLIPBOARD (buffer-substring (region-beginning) (region-end))))
         (t (shell-command-on-region (region-beginning) (region-end)
                                     (cond
                                      (*cygwin* "putclip")
                                      (*is-a-mac* "pbcopy")
                                      (*linux* "xsel -ib")))
            ))
        (message "Yanked region to clipboard!")
        (deactivate-mark))
        (message "No region active; can't yank to clipboard!")))

(defun paste-from-x-clipboard()
  (interactive)
  (cond
   ((and (display-graphic-p) x-select-enable-clipboard)
    (insert (x-selection 'CLIPBOARD)))
   (t (shell-command
       (cond
        (*cygwin* "getclip")
        (*is-a-mac* "pbpaste")
        (t "xsel -ob"))
       1))
   ))

(defun my/paste-in-minibuffer ()
  (local-set-key (kbd "M-y") 'paste-from-x-clipboard)
  )

(add-hook 'minibuffer-setup-hook 'my/paste-in-minibuffer)

PHẦN HAI

chèn mã bên dưới vào ~ / .emacs của bạn và từ giờ trở đi, sử dụng "Mx paste-from-clipboard-and-cc-kill-ring" để dán:

(defun paste-from-clipboard-and-cc-kill-ring ()
  "paste from clipboard and cc the content into kill ring"
  (interactive)
  (let (str)
    (with-temp-buffer
      (paste-from-x-clipboard)
      (setq str (buffer-string)))
    ;; finish the paste
    (insert str)
    ;; cc the content into kill ring at the same time
    (kill-new str)
    ))
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.