Salin teks dari Emacs ke papan klip OS X

25

Ketika saya menjalankan Emacs di terminal teks alih-alih mode GUI normal, saya dapat menyalin di Emacs dengan mengaktifkan awal suatu wilayah dengan C-SPC, dan kemudian pilih apa yang saya inginkan, dan kemudian lakukan M-w.

Apakah ada cara untuk membuat daerah yang disalin dengan cara ini tersedia di clipboard OSX untuk menempelkannya di halaman web (selain dengan menjalankan Emacs dalam mode GUI-nya, jelas)?

Saya tidak tertarik membuat pintasan yang berbeda untuk melakukan itu, dan idealnya tidak perlu menginstal modul apa pun.

Saya telah melihat posting ini dan mencoba jawaban yang diterima tetapi tampaknya tidak berfungsi seperti yang saya harapkan di atas.

Ada ide lain?

Galder Zamarreño
sumber
Bung, pertanyaannya hampir 3 tahun dan sudah dijawab
Galder Zamarreño

Jawaban:

33

Salin dari Emacs ke papan klip OS X:

pilih wilayah itu M-| pbcopy RET

Tempel dari clipboard OS X ke Emacs:

C-u M-| pbpaste RET (menggantikan wilayah saat ini jika ada)


Penjelasan:

M-|berjalan shell-command-on-region, yang sesuai namanya pipa wilayah saat ini ke perintah shell. C-u M-|melakukan hal yang sama, tetapi mengganti daerah saat ini dengan stdoutperintah yang sedang dijalankan.

pbcopydan pbpasteapakah utilitas OS X untuk mengakses clipboard sistem.

Andrei Simionescu
sumber
1
Selain menjawab pertanyaan, jawaban Anda mengajari saya cara menjalankan perintah shell dari emacs, Luar Biasa.
andreskwan
20

Berikut ini hanya berfungsi, disalin dari sini

(defun copy-from-osx ()
  (shell-command-to-string "pbpaste"))

(defun paste-to-osx (text &optional push)
  (let ((process-connection-type nil))
    (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
      (process-send-string proc text)
      (process-send-eof proc))))

(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)
Galder Zamarreño
sumber
Kata-kata di sini sepertinya terbalik
Jordon Biondo
1
Dengan mode jahat, ini mematahkan perilaku menempel vimish
Felix D.
@ Feliks .: apakah xclip-modemenderita masalah yang sama?
Stefan
Ini tampaknya rusak di Emacs26 ketika menyalin dan menempel karakter multibyte, seperti yang dijelaskan dalam emacs.stackexchange.com/questions/50485/…
silencej
9

Jika Anda menggunakan Emacs "cara normal" (yaitu sebagai aplikasi GUI), maka seharusnya sudah melakukannya secara default. Jika Anda menggunakan Emacs di dalam terminal emulator, maka memang tidak tahu cara melakukan itu secara default, tetapi Anda dapat menginstal xclippaket dari GNU ELPA dan kemudian mengaktifkan xclip-modeyang mengajarkan Emacs bagaimana melakukan itu baik untuk GNU / Linux dan untuk OSX.

Stefan
sumber
Apakah xclipbekerja dengan OSX? Dari apa yang saya lihat di luar sana, tampaknya dirancang untuk bekerja dengan X11, lihat posting
Galder Zamarreño
1
yang xclip.elpaket telah diperpanjang untuk menggunakan pbpaste.
Stefan
terminal emacs dalam mode server (bukan sebagai contoh biasa) macet ketika saya menggunakan xclip di bawah macOS untuk beberapa alasan.
rien333
Bisakah Anda melaporkannya sebagai bug (baik langsung ke saya atau via M-x report-emacs-bug?
Stefan
3

Seperti yang dikatakan Stefan, aplikasi grafis Emacs harus melakukan itu secara default.

Di terminal teks, opsi lain adalah menggunakan fungsi seperti ini:

(defun pbcopy ()
  (interactive)
  (let ((deactivate-mark t))
    (call-process-region (point) (mark) "pbcopy")))

(defun pbpaste ()
  (interactive)
  (call-process-region (point) (if mark-active (mark) (point)) "pbpaste" t t))

(defun pbcut ()
  (interactive)
  (pbcopy)
  (delete-region (region-beginning) (region-end)))
nisetama
sumber
kecuali kalau tidak. 20 tahun kemudian, pb yang sama di emacs .... Saya benar-benar berharap ada tanah yang umum dan waras, dibangun di atas batu di suatu tempat
nicolas
1

Inilah fungsi elisp sederhana yang bisa Anda masukkan ke dalam file .emacs Anda yang menyalin isi buffer yang ada di clipboard. Anda tidak harus memilih apa pun, itu menyalin semuanya. Kode ini pendek dan cukup jelas.

(defun xclip ()
(interactive)
(shell-command (concat "cat " (buffer-file-name (window-buffer (minibuffer-selected-window))) " | pbcopy")))
Jumar
sumber
Setelah Anda memuat atau memuat ulang emacs menyebutnya dengan Mx xclip.
jumar
OP tidak meminta untuk menyalin seluruh buffer ke clipboard, jadi ini tidak melakukan apa yang diminta. Adapun sisanya, ini sepertinya hanya meniru apa yang orang lain katakan.
Stefan
Saya minta maaf jika ini tampaknya di luar topik. Saya menavigasi ke halaman ini dari Google, di mana itu adalah hasil pertama untuk "menyalin teks ke clipboard emacs." Pertanyaannya berjudul "Salin teks dari Emacs ke OS X clipboard", jadi mudah untuk melihat bagaimana Anda bisa berakhir di sini untuk hasil pencarian itu. Saya pikir itu berlaku untuk cara frase yang diposting pertanyaan mereka, superset dari itu. Saya telah mengunjungi jawaban StackExchange sebelumnya dan merasa frustrasi ketika jawaban sederhana tidak tersedia, terutama ketika saya tahu ribuan orang mengajukan pertanyaan, jadi saya pikir saya akan menambahkan jawaban saya untuk orang-orang yang bisa mendapatkan manfaat.
jumar
0

Lihat clipboard-kill-regiondan clipboard-yank. Ini berasal menu-bar.el.

Setelah suatu wilayah disorot, Anda dapat menggunakan clipboard-kill-region untuk membunuh wilayah tersebut ke buffer tempel dan clipboard sistem. clipboard-yank "pasta" apa pun yang saat ini ada di clipboard sistem.

bitops
sumber
Harap perluas jawaban Anda.
Dan
Saya sudah mencoba menyalin sesuatu dari emacs menggunakan perintah-perintah itu, dan tidak tersedia secara eksternal untuk menyalinnya di tempat lain di luar Emacs.
Galder Zamarreño
@ GalderZamarreño berfungsi untuk saya di Emacs dan saya menggunakan OSX.
bitops
0

Jawaban Galder Zamarreño sangat bagus, namun, itu menghancurkan putperilaku seperti kejahatan dalam mode kejahatan. Karena itu saya telah mengadaptasinya sedikit di bawah ini — saya yakin itu bisa lebih baik, tetapi itu berhasil bagi saya. Jangan ragu untuk menyarankan peningkatan:

(defun copy-from-osx ()
  (shell-command-to-string "pbpaste"))

(defun paste-to-osx (text &optional push)
  (let ((process-connection-type nil))
    (let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
      (process-send-string proc text)
      (process-send-eof proc))))

----> Kode Baru

  (defun clipboard-on ()
    (interactive)
    (setq interprogram-cut-function 'paste-to-osx)
    (setq interprogram-paste-function 'copy-from-osx))
  (defun clipboard-off ()
    (interactive)
    (setq interprogram-cut-function 'gui-select-text)
    (setq interprogram-paste-function 'gui-selection-value))
  (global-set-key (kbd "C-c C-p") 'clipboard-on)
  (global-set-key (kbd "C-c C-y") 'clipboard-off))
tcelferact
sumber