Cara menyalin teks dari Emacs ke aplikasi lain di Linux


113

Ketika saya memotong (mematikan) teks di Emacs 22.1.1 (di jendelanya sendiri di X, di KDE, di Kubuntu), saya tidak bisa menempel (yank) di aplikasi lain.


Saya sarankan Anda membaca ini: Wiki CopyAndPaste-Emacs . Ini menjelaskan masalah tur dengan sangat baik.
El borito

Jawaban:


122

Mari berhati-hati dengan definisi kami di sini

  • Sebuah Emacs copy adalah perintah kill-ring-save(biasanya terikatM-w ).
  • Sebuah salinan sistem adalah apa yang biasanya Anda dapatkan dari menekan C-c(atau memilih "Edit-> Copy" di jendela aplikasi).
  • Sebuah salinan X adalah "secara fisik" menyoroti teks dengan kursor mouse.
  • Sebuah Emacs pasta adalah perintah yank(biasanya terikatC-y ).
  • Sebuah pasta sistem adalah apa yang biasanya Anda dapatkan dari menekanC-v (atau memilih "Edit-Paste" di jendela aplikasi).
  • Sebuah pasta X adalah menekan "tombol tengah tetikus" (simulasi dengan menekan tombol mouse kiri dan kanan bersama-sama).

Dalam kasus saya (di GNOME):

  • Baik Emacs dan salinan sistem biasanya bekerja dengan X paste.
  • Salinan X biasanya berfungsi dengan pasta Emacs.
  • Agar penyalinan sistem berfungsi dengan tempel Emacs dan penyalinan Emacs dengan tempel sistem, Anda perlu menambahkannya (setq x-select-enable-clipboard t)ke .emacs. Atau coba

    META-X set-variable RET x-select-enable-clipboard RET t

Saya pikir ini adalah perilaku Unix modern yang cukup standar.

Penting juga untuk dicatat (meskipun Anda mengatakan Anda menggunakan Emacs di jendela terpisah) bahwa ketika Emacs berjalan di konsol, itu benar-benar terpisah dari sistem dan papan klip X: potong dan tempel dalam hal ini dimediasi oleh terminal . Misalnya, "Edit-> Tempel" di jendela terminal Anda harus bertindak persis seperti jika Anda mengetik teks dari papan klip ke buffer Emacs.


7
Ini adalah terminologi yang membingungkan . Nama standar, dan tidak terlalu membingungkan, untuk apa yang Anda sebut "X copy / paste" adalah X pilihan utama. Apa yang Anda sebut "salin / tempel sistem" adalah X clipboard.
Gilles 'SO- berhenti bersikap jahat'

Terima kasih ... sepertinya variabel telah diganti namanya sejak ini ditulis. META-X set-variable RET select-enable-clipboard RET tatau(setq select-enable-clipboard t)
David McCorrie

95

Sisipkan berikut ini ke dalam .emacsfile Anda :

(setq x-select-enable-clipboard t)

3
Tidak bertele-tele, memberi tahu Anda apa yang perlu Anda ketahui. Jawaban yang sangat bagus.
JasonFruit

Bekerja dengan sempurna, saya menggunakan Ubuntu 12.04. Terima kasih
zhihong

7
Bagus dan sederhana, tetapi ini tidak berfungsi di terminal. Tidak ada alasan mengapa pintasan yang sama seharusnya tidak berfungsi baik di terminal dan jendela gratis, dan beberapa jawaban di bawah menangani keduanya secara bersamaan.
RussellStewart

1
Saat saya menjalankan emacs -nw, saya menggunakan pintasan terminal itu sendiri; Shift-Ctrl-X untuk memotong (mematikan) teks, dan Shift-Ctrl-C untuk menyalin.
memius

4
Itu tidak akan berhasil jika Anda menjalankan emacs -nwdi dalam jendela tmux yang terbelah secara horizontal.
Sridhar Ratnakumar

11

Saya tempelkan ini di .emacs saya:

(setq x-select-enable-clipboard t)
(setq interprogram-paste-function 'x-cut-buffer-or-selection-value)

Saya kemudian pada dasarnya tidak memiliki masalah dalam memotong dan menempelkan bolak-balik dari apa pun di Emacs ke aplikasi X11 atau Gnome lainnya.

Bonus: agar hal-hal ini terjadi di Emacs tanpa harus memuat ulang seluruh .emacs Anda, lakukan Cx Ce dengan kursor tepat setelah tanda kurung tutup dari setiap ekspresi tersebut di buffer .emacs.

Semoga berhasil!


3
Solusi ini bekerja untuk emacs di X Window yaitu emacs berjalan di dalam jendela jika Anda menjalankan emacs di baris perintah yang Anda butuhkan adalah: stackoverflow.com/questions/5288213/…
elviejo79

Symbol’s function definition is void: x-cut-buffer-or-selection-value
alper

10

Kesulitan dengan salin dan tempel di Emacs adalah Anda ingin itu bekerja secara independen dari internal kill / yank, dan Anda ingin itu bekerja baik di terminal dan gui. Ada solusi kuat yang ada untuk terminal atau gui, tetapi tidak keduanya. Setelah menginstal xsel (mis. sudo apt-get install xsel), Inilah yang saya lakukan untuk salin dan tempel untuk menggabungkannya:

(defun copy-to-clipboard ()
  (interactive)
  (if (display-graphic-p)
      (progn
        (message "Yanked region to x-clipboard!")
        (call-interactively 'clipboard-kill-ring-save)
        )
    (if (region-active-p)
        (progn
          (shell-command-on-region (region-beginning) (region-end) "xsel -i -b")
          (message "Yanked region to clipboard!")
          (deactivate-mark))
      (message "No region active; can't yank to clipboard!")))
  )

(defun paste-from-clipboard ()
  (interactive)
  (if (display-graphic-p)
      (progn
        (clipboard-yank)
        (message "graphics active")
        )
    (insert (shell-command-to-string "xsel -o -b"))
    )
  )

(global-set-key [f8] 'copy-to-clipboard)
(global-set-key [f9] 'paste-from-clipboard)

Karena saya menerima kesalahan karena tidak ada params. Saya perlu mengubah baris pertama "(defun copy-to-clipboard ()" menjadi "(defun copy-from-ubuntu (teks & push opsional)". Ini berfungsi untuk saya: D
Renato Cassino

Ini berfungsi tetapi operasi tempel cukup lambat, dapatkah itu disadari ke jaringan?
alper

7

Saya berasumsi dengan emacs yang Anda maksud adalah Emacs di bawah X (bukan di dalam jendela terminal).

Ada dua cara:

  1. (Berlaku untuk unix OS saja) Sorot teks yang diinginkan dengan mouse Anda (ini menyalinnya ke papan klip X) dan kemudian klik tengah untuk menempel.
  2. Sorot teks yang diinginkan dan kemudian "Mx clipboard-kill-ring-save" (perhatikan bahwa Anda dapat mengikat ini ke tombol yang lebih mudah). Kemudian cukup "Edit-> Tempel" di aplikasi favorit Anda.

Operasi clipboard tersedia:

  • clipboard-kill-ring-save - salin pilihan dari Emacs ke clipboard
  • clipboard-kill-region - potong pilihan dari Emacs ke clipboard
  • clipboard-yank - tempelkan dari clipboard ke Emacs

7

Ada artikel EmacsWiki yang menjelaskan beberapa masalah dengan salin & tempel di bawah X dan cara mengkonfigurasinya agar berfungsi.


Ada entri wiki emacs untuk disalin dan ditempel. Betapa buruknya itu.
nicolas

4

Ini bekerja dengan M-wdi Mac OSX. Cukup tambahkan ke file .emacs Anda .

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

Sumber https://gist.github.com/the-kenny/267162


1

Kode di bawah, terinspirasi oleh jawaban @ RussellStewart di atas, menambahkan dukungan untuk x-PRIMARY dan x-SECONDARY, menggantikan region-active-pdengan use-region-puntuk menutupi kasus wilayah kosong, tidak kembali diam-diam jika xsel belum diinstal (mengembalikan pesan kesalahan), dan menyertakan fungsi "potong" (emacs Cy, windows Cx).

(defun my-copy-to-xclipboard(arg)
  (interactive "P")
  (cond
    ((not (use-region-p))
      (message "Nothing to yank to X-clipboard"))
    ((and (not (display-graphic-p))
         (/= 0 (shell-command-on-region
                 (region-beginning) (region-end) "xsel -i -b")))
      (error "Is program `xsel' installed?"))
    (t
      (when (display-graphic-p)
        (call-interactively 'clipboard-kill-ring-save))
      (message "Yanked region to X-clipboard")
      (when arg
        (kill-region  (region-beginning) (region-end)))
      (deactivate-mark))))

(defun my-cut-to-xclipboard()
  (interactive)
  (my-copy-to-xclipboard t))

(defun my-paste-from-xclipboard()
  "Uses shell command `xsel -o' to paste from x-clipboard. With
one prefix arg, pastes from X-PRIMARY, and with two prefix args,
pastes from X-SECONDARY."
  (interactive)
  (if (display-graphic-p)
    (clipboard-yank)
   (let*
     ((opt (prefix-numeric-value current-prefix-arg))
      (opt (cond
       ((=  1 opt) "b")
       ((=  4 opt) "p")
       ((= 16 opt) "s"))))
    (insert (shell-command-to-string (concat "xsel -o -" opt))))))

(global-set-key (kbd "C-c C-w") 'my-cut-to-xclipboard)
(global-set-key (kbd "C-c M-w") 'my-copy-to-xclipboard)
(global-set-key (kbd "C-c C-y") 'my-paste-from-xclipboard)

Apakah ada alasan untuk tidak menimpa keybindings standar?
Paul Brodersen

@Paul: 'Keybindings standar' adalah untuk 'papan klip internal emacs', yang berbeda dari X-clipboard. Saya mengutip istilah 'emacs internal clipboard' karena terminologi emacs berbeda - lihat penjelasan Chris Conway yang sangat bagus di atas.
pengguna1404316

1

Saya menggunakan yang berikut ini, berdasarkan jawaban lain di sini, untuk membuat C-x C-wdan C-x C-ymenyalin dan menempel pada Mac dan Linux (jika seseorang mengetahui versi untuk Windows, silakan menambahkannya). Perhatikan bahwa di Linux Anda harus menginstal xsel dan xclip dengan manajer paket Anda.

;; Commands to interact with the clipboard

(defun osx-copy (beg end)
  (interactive "r")
  (call-process-region beg end  "pbcopy"))

(defun osx-paste ()
  (interactive)
  (if (region-active-p) (delete-region (region-beginning) (region-end)) nil)
  (call-process "pbpaste" nil t nil))

(defun linux-copy (beg end)
  (interactive "r")
  (call-process-region beg end  "xclip" nil nil nil "-selection" "c"))

(defun linux-paste ()
  (interactive)
  (if (region-active-p) (delete-region (region-beginning) (region-end)) nil)
  (call-process "xsel" nil t nil "-b"))

(cond
 ((string-equal system-type "darwin") ; Mac OS X
  (define-key global-map (kbd "C-x C-w") 'osx-copy)
  (define-key global-map (kbd "C-x C-y") 'osx-paste))
 ((string-equal system-type "gnu/linux") ; linux
  (define-key global-map (kbd "C-x C-w") 'linux-copy)
  (define-key global-map (kbd "C-x C-y") 'linux-paste)))

1
Sebenarnya, Anda juga dapat menggunakan xclipuntuk menempelkan konten papan klip dengan menggunakan xclip -o. Ini dapat bermanfaat bagi orang yang sudah memiliki xclipdan tidak ingin menginstal program lain untuk melakukan penyalinan dan penempelan.
Amin NAIRI

0

Hmm, platform apa dan emacs versi apa yang Anda gunakan? Dengan GNU Emacs 22.1.1 di Windows Vista, ini berfungsi dengan baik untuk saya.

Jika, kebetulan, Anda melakukan ini dari windows ke linux melalui penampil RealVNC, pastikan Anda menjalankan "vncconfig -iconic" di kotak linux terlebih dahulu .....


0

Saya selalu menggunakan pasta cepat - pilihan seret di emacs, tekan tombol tengah mouse di jendela target.

(Dari referensi ke kate, saya menganggap Anda menggunakan linux atau serupa dan mungkin menggunakan emacs di X dengan satu atau lain cara.)


0

Anda mungkin ingin menentukan platform apa yang Anda gunakan. Apakah di linux, unix, macosx, windows, ms-dos?

Saya percaya bahwa untuk windows itu harus berfungsi. Untuk MacOSX, ini akan ditambahkan ke papan klip x-windows, yang tidak sama dengan papan klip macosx. Untuk Linux, itu tergantung pada selera pengelola jendela Anda, tetapi saya percaya bahwa x-windows menanganinya dengan cara yang baik pada kebanyakan dari mereka.

Jadi, sebutkan.


-1

Yang saya lakukan adalah menggunakan alat terminal yang bagus (PuTTY di Windows, Konsole atau Terminal di Linux) yang memiliki fasilitas penyalinan built-in.

Di PuTTY, Anda menyorot teks yang Anda inginkan dengan mouse, lalu menempelkannya di tempat lain. Mengklik kanan di jendela PuTTY akan menyisipkan konten buffer salin / tempel Windows.

Di Konsole atau Terminal di Linux, Anda menyorot apa yang Anda inginkan lalu tekan Shift + Ctrl + C untuk menyalin dan Shift + Ctrl + V untuk menempel.

Dalam kompilasi win32 emacs, teks yanking meletakkannya di buffer salin / tempel .. sebagian besar waktu.

Di Mac OS X, pintasan tombol Apple berfungsi dengan baik, karena Terminal menjebaknya.

Tidak ada cara langsung untuk melakukannya di baris perintah karena shell tidak memelihara buffer salin / tempel untuk setiap aplikasi. pesta melakukan mempertahankan copy / paste penyangga untuk dirinya sendiri, dan, secara default, emacs ^ k / ^ y pintas kerja.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.