Tambahkan clipboard sistem operasi untuk mematikan dering

25

Seringkali saya mendapati diri saya menyalin potongan kode ke clipboard sistem operasi saya dari internet. Lalu, saya mengambil langkah-langkah sederhana berikut:

  1. Beralih ke jendela Emacs saya
  2. Temukan tempat di mana saya ingin menempelkan kode
  3. Gunakan C-y( yank) untuk menyisipkan teks yang disalin.

Namun, kadang-kadang saya menemukan (sangat mengecewakan saya) bahwa saya tanpa disadari menggunakan beberapa bentuk perintah kill (seperti kill-wordatau kill-line) ketika saya berada di langkah 2. Dalam kasus seperti itu, teks yang disalin dari "clipboard" tidak pernah membuatnya menjadi kill cincin.

Apakah ada cara untuk memastikan bahwa teks yang disalin dari aplikasi lain selalu membuatnya menjadi ring kill saya?

Saya paling sering bekerja di Linux, tetapi saya juga menggunakan Emacs secara teratur pada Windows dan Mac OS X, jadi jawaban OS-agnostik lebih disukai.

nispio
sumber
Bolehkah saya menyarankan tautan ini ? menelusuri seluruh halaman, Anda akan melihat banyak cara salin / tempel yang berbeda dari / ke clipboard
Nsukami _
@Nsukami_ Terima kasih. Saya akan mencoba mencernanya, tetapi halaman tertaut adalah contoh utama mengapa saya bosan mencari jawaban di EmacsWiki. Banyak peretas elisp di sana tampaknya berpikir bahwa kode elisp adalah mendokumentasikan diri sendiri dan tidak memerlukan komentar, dan tidak ada penjelasan tentang fungsi atau penggunaan. Saya biasanya tidak punya waktu untuk merekayasa balik kode hanya untuk memutuskan apakah ia melakukan apa yang saya inginkan atau tidak.
nispio
haha, saya mengerti;)
Nsukami _

Jawaban:

31

Anda perlu untuk menyesuaikan save-interprogram-paste-before-killuntuk t. Ini akan mendorong clipboard Anda ke pembunuhan jika Anda membunuh sesuatu di emacs sebelum menempelkan clipboard. Kustomisasi terkait adalah yank-pop-change-selectionyang mendorong yank Anda saat ini dalam emacs ke clipboard. Agar keduanya bisa berfungsi, Anda perlu x-select-enable-clipboard(diganti dengan gui-select-enable-clipboarddalam emacs 25.1) agar menjadi tdefault.

Alasan ini dimatikan secara default adalah untuk mencegah mendorong sejumlah besar data ke pembunuhan secara tidak sengaja yang berlangsung sepanjang sesi tidak seperti clipboard yang mudah diganti.

Vamsi
sumber
1
Bahkan lebih bersih dan lebih mudah dari yang saya harapkan. save-interprogram-paste-before-killtampaknya melakukan apa yang saya inginkan!
nispio
Saya di emacs 26, dan gui-select-enable-clipboarddipanggil adil select-enable-clipboard.
Rune Kaagaard
3

solusi lain hanya menggunakan alat Cli jika memungkinkan,

  • pbcopy / pbpaste di Mac

  • getclip / putclip di Cygwin

  • xsel di Linux
  • x-clipboard di GUI Emacs (seperti yang disebutkan lainnya, Anda perlu mengaktifkan flag x-select-enable-clipboard).

Keuntungan dari solusi ini adalah bahwa clipboard selalu dapat digunakan (misalnya, ketika Anda melakukan remote ssh).

Jawaban saya terdiri dari dua bagian. bagian satu memperkenalkan beberapa alat praktis untuk memanipulasi clipboard. bagian dua akan menjawab pertanyaan awal Anda (simpan clipboard di ring bunuh).

BAGIAN SATU

Masukkan kode di bawah ini ke ~ / .emacs Anda:

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

BAGIAN KEDUA

masukkan kode di bawah ini ke ~ / .emacs Anda, dan mulai sekarang, gunakan "Mx paste-from-clipboard-and-cc-kill-ring" untuk menempelkan:

(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)
    ))
chen bin
sumber