Jak skopiować tekst z Emacsa do innej aplikacji w systemie Linux

113

Kiedy wycinam (zabijam) tekst w Emacsie 22.1.1 (w jego własnym oknie na X, w KDE, na Kubuntu), nie mogę go wkleić (szarpnąć) w żadnej innej aplikacji.

memius
źródło
Proponuję przeczytać to: CopyAndPaste-Emacs Wiki . To bardzo dobrze wyjaśnia problem wycieczki.
El borito

Odpowiedzi:

122

Uważajmy na nasze definicje tutaj

  • Emacs kopia jest polecenie kill-ring-save(zwykle związanyM-w ).
  • Kopia systemu jest to, co zwykle się od naciśnięcia C-c(lub wybierając „Edycja-> Kopiuj” w oknie aplikacji).
  • X kopia jest „fizycznie” podkreślając tekst za pomocą kursora myszy.
  • Pasta Emacs jest polecenie yank(zwykle związany C-y).
  • Pasta systemu jest to, co zwykle się od naciśnięcia C-v(lub wybierając polecenie „Edycja-Wklej” w oknie aplikacji).
  • Wklejanie X polega na naciśnięciu „środkowego przycisku myszy” (symulowane przez jednoczesne naciśnięcie lewego i prawego przycisku myszy).

W moim przypadku (w GNOME):

  • Zarówno Emacs, jak i kopia systemowa zwykle działają z wklejaniem X.
  • X copy zazwyczaj działa z pastą Emacsa.
  • Aby kopiowanie systemowe działało z wklejaniem Emacsa, a kopiowanie Emacsa z wklejaniem systemowym, musisz dodać (setq x-select-enable-clipboard t)plik .emacs. Albo spróbuj

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

Myślę, że jest to całkiem standardowe zachowanie współczesnego Uniksa.

Ważne jest również, aby zauważyć (chociaż mówisz, że używasz Emacsa w osobnym oknie), że kiedy Emacs działa w konsoli, jest on całkowicie oddzielony od systemu i X-clipboardów: wycinanie i wklejanie w tym przypadku jest pośredniczone przez terminal . Na przykład „Edycja-> Wklej” w oknie terminala powinno działać dokładnie tak, jakbyś wpisał tekst ze schowka do bufora Emacsa.

Chris Conway
źródło
7
To jest myląca terminologia . Standardowa i mniej myląca nazwa tego, co nazywasz „kopiowaniem / wklejaniem X”, jest podstawowym wyborem X. To, co nazywasz „systemowym kopiowaniem / wklejaniem”, to schowek X.
SO- Gilles 'SO- przestań być zły'
Dzięki ... wygląda na to, że nazwa zmiennej została zmieniona od czasu napisania tego. META-X set-variable RET select-enable-clipboard RET tlub(setq select-enable-clipboard t)
David McCorrie
95

Wstaw do swojego .emacspliku:

(setq x-select-enable-clipboard t)
memius
źródło
3
Nie rozwlekły, mówi ci to, co musisz wiedzieć. Doskonała odpowiedź.
JasonFruit
Działa idealnie, używam Ubuntu 12.04. Dzięki
zhihong
7
Ładnie i prosto, ale to nie działa w terminalu. Nie ma powodu, dla którego ten sam skrót nie powinien działać zarówno w terminalu, jak iw wolnym oknie, a niektóre z poniższych odpowiedzi dotyczą obu jednocześnie.
RussellStewart
1
Kiedy uruchamiam emacs -nw, używam własnych skrótów terminala; Shift-Ctrl-X, aby wyciąć (zabić) tekst i Shift-Ctrl-C, aby skopiować.
memius
4
To nie zadziała, gdy wejdziesz emacs -nwdo poziomo podzielonych okien tmux.
Sridhar Ratnakumar
11

Wklejam to w moim .emacs:

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

Następnie w zasadzie nie mam problemów z wycinaniem i wklejaniem czegokolwiek w Emacsie do jakiejkolwiek innej aplikacji X11 lub Gnome.

Bonus: aby te rzeczy działy się w Emacs bez konieczności przeładowywania całego pliku .emacs, wykonaj Cx Ce kursorem tuż po zamknięciu każdego z tych wyrażeń w buforze .emacs.

Powodzenia!

jfm3
źródło
3
To rozwiązanie działa dla emacsa w oknie X, tj. Emacs działa w oknie, jeśli używasz emacsa w wierszu poleceń, potrzebujesz: stackoverflow.com/questions/5288213/ ...
elviejo79
Symbol’s function definition is void: x-cut-buffer-or-selection-value
Alper
10

Trudność z kopiowaniem i wklejaniem w Emacsie polega na tym, że chcesz, aby działał niezależnie od wewnętrznego zabijania / szarpania i chcesz, aby działał zarówno w terminalu, jak i w interfejsie użytkownika. Istnieją solidne rozwiązania dla terminala lub interfejsu GUI, ale nie obu. Po zainstalowaniu xsel (np. sudo apt-get install xsel), Oto co robię, aby skopiować i wkleić, aby je połączyć:

(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)
RussellStewart
źródło
Ponieważ otrzymuję błąd, ponieważ nie ma parametrów. Muszę zmienić pierwszą linię "(defun copy-to-clipboard ()" na "(defun copy-from-ubuntu (tekst i opcjonalne wypychanie)". To działa dla mnie: D
Renato Cassino,
Działa, ale operacja wklejania jest dość powolna, czy można ją przenieść do sieci?
Alper
7

Zakładam, że przez emacs masz na myśli Emacsa pod X (tj. Nie w oknie terminala).

Istnieją dwa sposoby:

  1. (Dotyczy tylko systemów operacyjnych unix) Podświetl żądany tekst za pomocą myszy (spowoduje to skopiowanie go do schowka X), a następnie kliknij środkowym przyciskiem, aby wkleić.
  2. Podświetl żądany tekst, a następnie „Mx clipboard-kill-ring-save” (pamiętaj, że możesz powiązać to z łatwiejszym klawiszem). Następnie po prostu „Edytuj-> Wklej” w swojej ulubionej aplikacji.

Dostępne operacje na schowku:

  • clipboard-kill-ring-save - skopiuj zaznaczenie z Emacsa do schowka
  • clipboard-kill-region - wycina zaznaczenie z Emacsa do schowka
  • clipboard-yank - wklej ze schowka do Emacsa
pdq
źródło
7

Jest artykuł EmacsWiki, który wyjaśnia niektóre problemy z kopiowaniem i wklejaniem pod X oraz jak go skonfigurować do pracy.

cschol
źródło
Istnieje wpis wiki dotyczący emacsa do skopiowania i wklejenia. Tak to jest złe.
nicolas
4

Działa to M-ww systemie Mac OSX. Po prostu dodaj do swojego pliku .emacs .

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

Źródło https://gist.github.com/the-kenny/267162

cevaris
źródło
1

Poniższy kod, zainspirowany @ odpowiedź RussellStewart jest powyżej, dodaje wsparcie dla X-primary i X-średnie, zastępuje region-active-pz use-region-ppokryć przypadku pustego obszaru, nie powróci cicho jeśli Xsel nie został zainstalowany (zwraca komunikat o błędzie), i zawiera funkcję "wytnij" (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)
user1404316
źródło
Czy są jakieś powody, aby nie nadpisywać standardowych przypisań klawiszy?
Paul Brodersen,
@Paul: „Standardowe skróty klawiszowe” dotyczą „wewnętrznego schowka emacsa”, który różni się od schowka X. Zacytowałem termin „wewnętrzny schowek emacsa”, ponieważ terminologia emacsa jest inna - odwołaj się do doskonałego wyjaśnienia Chrisa Conwaya powyżej.
user1404316
1

Używam następujących, na podstawie innych odpowiedzi tutaj, do tworzenia C-x C-wi C-x C-ykopiowania i wklejania zarówno na Macu, jak i na Linuksie (jeśli ktoś zna wersję dla Windowsa, możesz ją dodać). Zwróć uwagę, że w systemie Linux będziesz musiał zainstalować xsel i xclip z menedżerem pakietów.

;; 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)))
asmeurer
źródło
1
Właściwie możesz użyć xclipdo wklejania zawartości schowka, używając xclip -o. Może to być przydatne dla osób, które już mają xclipi nie chcą instalować innego programu do kopiowania i wklejania.
Amin NAIRI
0

Hmm, jakiej platformy i jakiej wersji emacsa używasz? Z GNU Emacs 22.1.1 w systemie Windows Vista działa dobrze.

Jeśli, przez przypadek, robisz to z Windows do Linuksa przez przeglądarkę RealVNC, upewnij się, że używasz najpierw "vncconfig -iconic" na Linuksie .....

kfh
źródło
0

Zawsze używam szybkiego wklejania - przeciągnij zaznaczenie w emacsie, naciśnij środkowy przycisk myszy w oknie docelowym.

(Odnośnie do Kate, rozumiem, że jesteś na Linuksie lub podobnym i prawdopodobnie używasz emacsa w X w taki czy inny sposób).

cannam
źródło
0

Możesz chcieć określić, jakiej platformy używasz. Czy działa na Linuksie, Uniksie, Macosxie, Windowsie, MS-DOS?

Uważam, że w przypadku okien powinno działać. W przypadku MacOSX zostanie dodany do schowka x-windows, co nie jest tym samym, co schowek macosx. W przypadku Linuksa zależy to od twojego stylu menedżera okien, ale uważam, że x-windows radzi sobie z tym w przyjemny sposób na większości z nich.

Więc proszę sprecyzować.

Mats Fredriksson
źródło
-1

Używam dobrego narzędzia terminalowego (PuTTY w systemie Windows, Konsole lub Terminal w systemie Linux), które ma wbudowane funkcje kopiowania.

W PuTTY zaznaczasz wybrany tekst myszą, a następnie wklejasz go w innym miejscu. Kliknięcie prawym przyciskiem myszy w oknie programu PuTTY powoduje wklejenie zawartości buforu kopiuj / wklej systemu Windows.

W Konsoli lub Terminalu w systemie Linux podświetlasz to, co chcesz, a następnie naciśnij Shift + Ctrl + C, aby skopiować i Shift + Ctrl + V, aby wkleić.

W kompilacji emacsa win32, yankowanie tekstu umieszcza go w buforze kopiuj / wklej .. przez większość czasu.

W systemie Mac OS X czortony z klawiszem Apple działają dobrze, ponieważ Terminal je przechwytuje.

Nie ma bezpośredniego sposobu, aby to zrobić w linii poleceń, ponieważ powłoka nie utrzymuje buforu kopiuj / wklej dla każdej aplikacji. bash robi zachować kopię / wklej bufor dla siebie, a domyślnie emacs ^ K / ^ y skróty pracy.

królikarnia
źródło