Emacs'ten Linux'ta başka bir uygulamaya metin kopyalama


113

Emacs 22.1.1'de (kendi penceresinde X'te, KDE'de, Kubuntu'da) metni kestiğimde (öldürdüğümde), onu başka bir uygulamaya yapıştıramıyorum (çekemiyorum).


Bunu okumanızı öneririm: CopyAndPaste-Emacs Wiki . Bu tur sorununu çok iyi açıklıyor.
El borito

Yanıtlar:


122

Buradaki tanımlarımıza dikkat edelim

  • Bir Emacs kopyası komuttur kill-ring-save(genellikle bağlıdır M-w).
  • Bir sistem kopyası genellikle basarak aldığım şeydir C-c(veya uygulama penceresinde "düzenle-> Kopya" tercih).
  • Bir X kopyası "Fiziksel" fare imleci ile metin vurgulama edilir.
  • Bir Emacs macun komutu yank(genellikle bağlı C-y).
  • Bir sistem yapıştırması , genellikle düğmesine basarak C-v(veya bir uygulama penceresinde "Düzenle-Yapıştır" ı seçerek) elde ettiğiniz şeydir .
  • Bir X yapıştırması "orta fare düğmesine" basmaktır (sol ve sağ fare düğmelerine birlikte basılarak simüle edilir).

Benim durumumda (GNOME'da):

  • Hem Emacs hem de sistem kopyası genellikle X yapıştırma ile çalışır.
  • X kopyası genellikle Emacs yapıştırmasıyla çalışır.
  • Sistem kopyasının Emacs pastası ile çalışması ve Emacs kopyasının sistem yapıştırması ile çalışması (setq x-select-enable-clipboard t)için .emacs. Veya Dene

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

Bence bu oldukça standart modern Unix davranışı.

Ayrıca (Emacs'i ayrı bir pencerede kullandığınızı söyleseniz de), Emacs bir konsolda çalışırken, sistemden ve X panolarından tamamen boşandığını unutmamak önemlidir: bu durumda kes ve yapıştır, terminal tarafından gerçekleştirilir. . Örneğin, terminal pencerenizdeki "Düzenle-> Yapıştır", tıpkı panodaki metni Emacs arabelleğine yazmışsınız gibi davranmalıdır.


7
Bu kafa karıştırıcı bir terminoloji . "X kopyala / yapıştır" dediğiniz şey için standart ve daha az kafa karıştırıcı olan ad, X birincil seçimidir. "Sistem kopyala / yapıştır" dediğiniz şey X panosudur.
Gilles 'SO- kötü olmayı bırak'

Teşekkürler ... Görünüşe göre değişken, bu yazıldığından beri yeniden adlandırılmış. META-X set-variable RET select-enable-clipboard RET tveya(setq select-enable-clipboard t)
David McCorrie

95

Aşağıdakileri .emacsdosyanıza ekleyin :

(setq x-select-enable-clipboard t)

3
Wordy değil, bilmeniz gerekenleri söyler. Mükemmel cevap.
JasonFruit

Mükemmel çalışıyor, Ubuntu 12.04 kullanıyorum. Teşekkürler
zhihong

7
Güzel ve basit, ancak bu terminalde çalışmıyor. Aynı kısayolun hem terminalde hem de boş bir pencerede çalışmaması için hiçbir neden yoktur ve aşağıdaki yanıtlardan bazıları her ikisini de aynı anda ele alır.
RussellStewart

1
Çalıştırdığımda emacs -nw, terminalin kendi kısayollarını kullanıyorum; Metni kesmek (öldürmek) için Shift-Ctrl-X ve kopyalamak için Shift-Ctrl-C.
memius

4
emacs -nwYatay olarak bölünmüş tmux pencerelerinin içinde koştuğunuzda bu işe yaramayacak .
Sridhar Ratnakumar

11

Bunu .emac'lerime yapıştırıyorum:

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

Daha sonra, Emacs'taki herhangi bir şeyden başka herhangi bir X11 veya Gnome uygulamasına kesme ve yapıştırma konusunda temelde hiçbir sorun yaşamadım.

Bonus: Tüm .emac'larınızı yeniden yüklemenize gerek kalmadan bunları Emacs'de gerçekleştirmek için, .emacs arabelleğindeki bu ifadelerin her birinin yakın parantezinden hemen sonra imleçle Cx Ce yapın.

İyi şanslar!


3
Bu çözüm bir X Penceresindeki
emac'ler için işe yarar

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

10

Emacs'de kopyalayıp yapıştırmanın zorluğu, dahili öldürme / yank'tan bağımsız çalışmasını istemeniz ve hem terminalde hem de gui'de çalışmasını istemenizdir. Terminal veya gui için mevcut sağlam çözümler var, ancak ikisi birden değil. Xsel'i (örn. sudo apt-get install xsel) Yükledikten sonra , bunları birleştirmek için kopyalayıp yapıştırmak için yaptığım şey:

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

Çünkü param olmadığı için hata alıyorum. İlk satırı "(panoya kopyalamayı () defun" (defun copy-from-ubuntu (metin ve isteğe bağlı itme)) olarak değiştirmem gerekiyor. Bu benim için çalışıyor: D
Renato Cassino

Çalışıyor ama yapıştırma işlemi oldukça yavaş, ağa uygulanabilir mi?
alper

7

Emacs ile X altında Emacs'i kastettiğinizi varsayıyorum (yani bir terminal penceresi içinde değil).

İki yol var:

  1. (Yalnızca unix işletim sistemleri için geçerlidir) Farenizle istenen metni vurgulayın (bu, onu X panosuna kopyalar) ve ardından yapıştırmak için orta tıklayın.
  2. İstenen metni vurgulayın ve ardından "Mx clipboard-kill-ring-save" (bunu daha kolay bir anahtara bağlayabileceğinizi unutmayın). Sonra favori uygulamanızda sadece "Düzenle-> Yapıştır".

Mevcut pano işlemleri:

  • clipboard-kill-ring-save - seçimi Emacs'ten panoya kopyala
  • clipboard-kill-region - Emacs'ten panoya seçimi kes
  • clipboard-yank - panodan Emacs'e yapıştırın

7

Orada bir EmacsWiki makale kopya & yapıştırarak X altında ve nasıl işe yapılandırmak için bazı sorunlar açıklanır.


Kopyalayıp yapıştırmak için bir emacs wiki girişi var. Bu ne kadar kötü.
nicolas

4

Bu M-w, Mac OSX'te çalışır . .Emacs dosyanıza eklemeniz yeterlidir .

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

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


1

Aşağıdaki kod, @ RussellStewart'ın yukarıdaki yanıtından esinlenerek, x-PRIMARY ve x-SECONDARY için destek ekler, boş bir bölge durumunu kapsayacak şekilde değiştirilir region-active-p, use-region-pxsel kurulmamışsa sessizce geri dönmez (bir hata mesajı verir), ve bir "kesme" işlevi içerir (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)

Standart tuş atamalarının üzerine yazılmaması için herhangi bir sebep var mı?
Paul Brodersen

@Paul: 'Standart tuş atamaları', X-panosundan farklı olan 'emacs dahili panosu' içindir. Emacs terminolojisi farklı olduğu için 'emacs internal clipboard' terimini aktardım - Chris Conway'in yukarıdaki mükemmel açıklamasına bakın.
user1404316

1

Ben yapmak için, burada diğer yanıtlara dayalı aşağıdaki kullanmak C-x C-wve C-x C-yolmak kopyası ile (birisi Windows için sürüm biliyorsa eklemek için çekinmeyin) Mac ve Linux hem de yapıştırın. Linux'ta paket yöneticinizle xsel ve xclip'i kurmanız gerekeceğini unutmayın.

;; 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
Aslında, xclipkullanarak pano içeriğini yapıştırmak için de kullanabilirsiniz xclip -o. Bu, xcliphem kopyalamayı hem de yapıştırmayı yapmak için halihazırda başka bir programa sahip olan ve istemeyen kişiler için yararlı olabilir .
Amin NAIRI

0

Hmm, hangi platformu ve hangi emacs sürümünü kullanıyorsunuz? Windows Vista'daki GNU Emacs 22.1.1 ile benim için iyi çalışıyor.

Şans eseri, bunu bir RealVNC görüntüleyici aracılığıyla Windows'tan linux'a yapıyorsanız, önce linux kutusunda "vncconfig -iconic" komutunu çalıştırdığınızdan emin olun .....


0

Her zaman hızlı yapıştır - emacs'de seçimi sürükleyin, hedef pencerede farenin orta düğmesine basın.

(Kate'e göre, linux veya benzeri bir yerde olduğunuzu ve muhtemelen X'de emac'leri şu veya bu şekilde kullandığınızı varsayıyorum.)


0

Hangi platformu kullandığınızı belirtmek isteyebilirsiniz. Linux, unix, macosx, windows, ms-dos'da mı?

Windows için çalışması gerektiğine inanıyorum. MacOSX için, macosx panosuyla aynı şey olmayan x-windows panosuna eklenecektir. Linux için, pencere yöneticisi tarzınıza bağlıdır, ancak x-windows'un bunu çoğu için iyi bir şekilde ele aldığına inanıyorum.

Lütfen belirtiniz.


-1

Yaptığım şey, yerleşik kopyalama olanaklarına sahip iyi bir terminal aracı (Windows'ta PuTTY, Linux'ta Konsole veya Terminal) kullanmaktır.

PuTTY'de, istediğiniz metni fare ile vurgular ve ardından başka bir yere yapıştırırsınız. PuTTY penceresine sağ tıklandığında Windows kopyala / yapıştır arabelleğinin içeriği yapıştırılır.

Linux'ta Konsole veya Terminal'de, istediğinizi vurgular, ardından kopyalamak için Shift + Ctrl + C ve yapıştırmak için Shift + Ctrl + V tuşlarına basın.

Win32 emacs derlemesinde, yanking metni onu kopyala / yapıştır arabelleğine koyar .. çoğu zaman.

Mac OS X'te, Apple tuşu chortcut'ları iyi çalışıyor çünkü Terminal onları yakaladı.

Komut satırında bunu yapmanın doğrudan bir yolu yoktur çünkü kabuk her uygulama için bir kopyala / yapıştır tamponu tutmaz. bash , kendisi için bir kopyala / yapıştır arabelleği tutar ve varsayılan olarak emacs ^ k / ^ y kısayolları çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.