Skopiuj tekst z Emacsa do schowka OS X

25

Kiedy uruchamiam Emacsa w terminalu tekstowym zamiast w normalnym trybie GUI, mogę kopiować w Emacsie, aktywując początek regionu za pomocą C-SPC, a następnie wybierz to, co chcę, a następnie zrób M-w.

Czy jest jakiś sposób na skopiowanie regionu w ten sposób, aby był dostępny w schowku OSX i wkleić go na stronie internetowej (oczywiście poza uruchomieniem Emacsa w trybie GUI)?

Nie jestem zainteresowany stworzeniem innego skrótu, aby to zrobić i idealnie nie powinno to wymagać instalowania żadnych modułów.

Widziałem ten post i wypróbowałem zaakceptowaną odpowiedź, ale nie działa ona tak, jak oczekuję powyżej.

Jakieś inne pomysły?

Galder Zamarreño
źródło
Koleś, pytanie ma prawie 3 lata i odpowiedziano
Galder Zamarreño,

Odpowiedzi:

33

Skopiuj ze schowka Emacsa do OS X:

następnie wybierz region M-| pbcopy RET

Wklej ze schowka OS X do Emacsa:

C-u M-| pbpaste RET (zastępuje bieżący region, jeśli istnieje)


Wyjaśnienie:

M-|działa shell-command-on-region, co jak sama nazwa wskazuje potokuje bieżący region do polecenia powłoki. C-u M-|robi to samo, ale zastępuje bieżący region stdouturuchomionym poleceniem.

pbcopyi pbpastesą narzędziami OS X do uzyskiwania dostępu do schowka systemowego.

Andrei Simionescu
źródło
1
Oprócz odpowiedzi na pytanie, twoja odpowiedź nauczyła mnie, jak uruchamiać polecenia powłoki z emacsa, Amazing.
andreskwan
20

Poniższe po prostu działa, skopiowane stąd

(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
źródło
Verbage tutaj wydaje się
odwrócone
1
W trybie złym przerywa to vimish wklejanie
Felix D.
@FelixD .: Czy xclip-modecierpi na ten sam problem?
Stefan
Wydaje się to uszkodzone w Emacs26 podczas kopiowania i wklejania znaków wielobajtowych, jak opisano w emacs.stackexchange.com/questions/50485/…
silencej
9

Jeśli używasz Emacsa „w normalny sposób” (tj. Jako aplikację GUI), powinien już to zrobić domyślnie. Jeśli używasz Emacsa w emulatorze terminali, to rzeczywiście nie wie, jak to zrobić domyślnie, ale możesz zainstalować xclippakiet z GNU ELPA, a następnie włączyć program, xclip-modektóry uczy Emacsa, jak to zrobić zarówno dla GNU / Linux, jak i dla OSX.

Stefan
źródło
Czy xclipdziała z OSX? Z tego, co widziałem, wydaje się, że jest przeznaczony do współpracy z X11, patrz post
Galder Zamarreño
1
xclip.elpakiet został przedłużony do wykorzystania pbpaste.
Stefan
terminal emacs w trybie serwera (nie jako zwykła instancja) zawiesza się, gdy z jakiegoś powodu używam xclip pod macOS.
rien333
Czy możesz zgłosić to jako błąd (bezpośrednio do mnie lub za pośrednictwem M-x report-emacs-bug?
Stefan
3

Jak powiedział Stefan, aplikacje graficzne Emacsa powinny to robić domyślnie.

W terminalu tekstowym inną opcją jest użycie takich funkcji:

(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
źródło
chyba że nie. 20 lat później ta sama osoba w emacs ... Naprawdę chciałbym, żeby była jakaś wspólna i zdrowa ziemia, osadzona gdzieś w kamieniu
Nicolas
1

Oto prosta funkcja elisp, którą możesz umieścić w pliku .emacs, który kopiuje zawartość bufora, który znajdujesz się do schowka. Nie musisz nic wybierać, to wszystko kopiuje. Kod jest krótki i dość zrozumiały.

(defun xclip ()
(interactive)
(shell-command (concat "cat " (buffer-file-name (window-buffer (minibuffer-selected-window))) " | pbcopy")))
jumar
źródło
Po załadowaniu lub przeładowaniu emacsa wywołaj go za pomocą Mx xclip.
jumar
OP nie poprosił o skopiowanie całego bufora do schowka, więc to nie robi tego, o co proszono. Co do reszty, zdaje się to powielać to, co już powiedzieli inni.
Stefan
Przepraszam, jeśli wydaje się to nie na temat. Nawigowałem do tej strony z Google, gdzie był to pierwszy wynik dla „skopiuj tekst do schowka emacs”. Pytanie zatytułowane jest „Skopiuj tekst z Emacsa do schowka OS X”, więc łatwo jest zobaczyć, jak możesz skończyć tutaj dla tego wyniku wyszukiwania. Myślę, że ma to zastosowanie do sposobu, w jaki zamieszczona fraza ich pytania, ich nadzbiór. Odwiedziłem już StackExchange i byłem sfrustrowany, gdy prosta odpowiedź nie była dostępna, szczególnie gdy wiedziałem, że tysiące ludzi zadają to pytanie, więc pomyślałem, że dodam moje dla osób, które mogłyby skorzystać.
jumar
0

Sprawdź clipboard-kill-regioni clipboard-yank. Te pochodzą z menu-bar.el.

Po podświetleniu regionu możesz użyć schowka-kill-region, aby zabić region zarówno do bufora wklejania, jak i schowka systemowego. clipboard-yank „wkleja” wszystko, co jest aktualnie w schowku systemowym.

bitopy
źródło
Rozwiń swoją odpowiedź.
Dan
Próbowałem skopiować coś z emacsa za pomocą tych poleceń i nie byłem dostępny na zewnątrz, aby skopiować to gdzieś poza Emacsem.
Galder Zamarreño
@ GalderZamarreño to działa dla mnie w Emacs i jestem na OSX.
bitops
0

Odpowiedź Galdera Zamarreño jest świetna, jednak łamie złe putzachowanie w trybie zła. Dlatego zaadaptowałem to nieco poniżej - jestem pewien, że może być lepiej, ale dla mnie to działa. Możesz zaproponować ulepszenia:

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

----> Nowy kod

  (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
źródło