เพิ่มคลิปบอร์ดระบบปฏิบัติการเพื่อฆ่าริง


25

บ่อยครั้งที่ฉันพบว่าตัวเองกำลังคัดลอกข้อมูลโค้ดลงในคลิปบอร์ดของระบบปฏิบัติการจากอินเทอร์เน็ต จากนั้นฉันก็ทำตามขั้นตอนง่าย ๆ ดังต่อไปนี้:

  1. สลับไปที่หน้าต่าง Emacs ของฉัน
  2. ค้นหาสถานที่ที่ฉันต้องการวางรหัส
  3. ใช้C-y( yank) เพื่อแทรกข้อความที่คัดลอก

อย่างไรก็ตามบางครั้งฉันพบว่า (ฉันผิดหวังมาก) ที่ฉันใช้คำสั่ง kill บางรูปแบบ (เช่นkill-wordหรือkill-line) ในขณะที่ฉันอยู่ในขั้นตอนที่ 2 ในกรณีเช่นนี้ข้อความที่คัดลอกมาจาก "คลิปบอร์ด" ไม่เคยทำให้เกิดการฆ่า แหวน.

มีวิธีที่จะทำให้แน่ใจว่าข้อความที่คัดลอกจากแอปพลิเคชันอื่น ๆ ทำให้มันกลายเป็นวงแหวนสังหารของฉันหรือไม่?

ฉันทำงานบน Linux บ่อยที่สุด แต่ฉันยังใช้ Emacs เป็นประจำใน Windows และ Mac OS X ดังนั้นจึงต้องการคำตอบที่ไม่เชื่อเรื่องพระเจ้า


ฉันขอแนะนำลิงค์นี้ได้ไหม การเรียกดูทั้งหน้าคุณจะเห็นวิธีการคัดลอก / วางจาก / ไปยังคลิปบอร์ดที่แตกต่างกันมากมาย
Nsukami _

@Nsukami_ ขอบคุณ ฉันจะพยายามแยกย่อย แต่หน้าเชื่อมโยงเป็นตัวอย่างสำคัญว่าทำไมฉันถึงเบื่อที่จะหาคำตอบที่ EmacsWiki ดูเหมือนว่าแฮ็กเกอร์ elisp หลายคนคิดว่ารหัส elisp นั้นจัดทำเอกสารด้วยตนเองและไม่ต้องแสดงความคิดเห็นและไม่มีคำอธิบายเกี่ยวกับฟังก์ชั่นหรือการใช้งาน ปกติฉันไม่มีเวลาที่จะทำวิศวกรรมย้อนกลับโค้ดเพื่อตัดสินใจว่ามันทำในสิ่งที่ฉันต้องการหรือไม่
nispio

ฮ่าฮ่าฉันเข้าใจ;)
Nsukami _

คำตอบ:


31

คุณจำเป็นต้องปรับแต่งการsave-interprogram-paste-before-kill tสิ่งนี้จะผลักคลิปบอร์ดของคุณไปสู่การสังหารในกรณีที่คุณฆ่าบางอย่างด้วย emacs ก่อนที่จะวางคลิปบอร์ด การปรับแต่งที่เกี่ยวข้องคือการyank-pop-change-selectionที่คุณดึงงัด emacs ปัจจุบันของคุณไปยังคลิปบอร์ด เพื่อให้ทั้งสองทำงานได้คุณต้องx-select-enable-clipboard(แทนที่ด้วยgui-select-enable-clipboardemacs 25.1) เพื่อให้tเป็นค่าเริ่มต้น

เหตุผลที่ถูกปิดใช้งานโดยค่าเริ่มต้นคือเพื่อป้องกันการส่งข้อมูลจำนวนมากไปยังการฆ่าโดยไม่ตั้งใจซึ่งยังคงมีอยู่ตลอดเซสชันซึ่งต่างจากคลิปบอร์ดที่เปลี่ยนได้ง่าย


1
แม้จะสะอาดและง่ายกว่าที่ฉันคาดไว้ save-interprogram-paste-before-killดูเหมือนว่าจะทำสิ่งที่ฉันต้องการ!
nispio

ฉัน emacs 26 และจะเรียกว่าเพียงแค่gui-select-enable-clipboard select-enable-clipboard
Rune Kaagaard

3

อีกวิธีคือใช้เครื่องมือ cli ถ้าเป็นไปได้

  • pbcopy / pbpaste บน Mac

  • getclip / putclip บน Cygwin

  • xsel บน Linux
  • x-clipboard ใน GUI Emacs (ตามที่คนอื่นพูดถึงคุณต้องเปิดแฟล็ก x-select-enable-clipboard)

ข้อดีของการแก้ปัญหานี้คือคลิปบอร์ดสามารถใช้งานได้เสมอ (ตัวอย่างเช่นเมื่อคุณรีโมต ssh)

คำตอบของฉันมีสองส่วน ส่วนหนึ่งแนะนำเครื่องมือที่มีประโยชน์บางอย่างเพื่อจัดการคลิปบอร์ด ส่วนที่สองจะตอบคำถามเดิมของคุณ (เก็บคลิปบอร์ดไว้ในแหวนฆ่า)

ส่วนหนึ่ง

ใส่รหัสด้านล่างลงใน ~ / .emacs ของคุณ:

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

ส่วนที่สอง

แทรกรหัสด้านล่างลงใน ~ / .emacs ของคุณและจากนี้ไปใช้ "Mx paste-from-clipboard-and-cc-kill-ring" เพื่อวาง:

(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)
    ))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.