Sao chép văn bản từ Emacs vào bảng tạm OS X


25

Khi tôi chạy Emacs trong một thiết bị đầu cuối văn bản thay vì chế độ GUI thông thường, tôi có thể sao chép trong Emacs bằng cách kích hoạt bắt đầu một khu vực với C-SPC, sau đó chọn những gì tôi muốn và sau đó làm M-w.

Có cách nào để có được một khu vực được sao chép theo cách này có sẵn trong bảng tạm OSX để dán nó vào một trang web (ngoài việc chạy Emacs trong chế độ GUI của nó, rõ ràng) không?

Tôi không quan tâm đến việc tạo một lối tắt khác để làm điều đó và lý tưởng là nó không yêu cầu cài đặt bất kỳ mô-đun nào.

Tôi đã xem bài đăng này và đã thử câu trả lời được chấp nhận nhưng dường như nó không hoạt động theo cách tôi mong đợi ở trên.

Còn ý tưởng nào khác không?


Anh bạn, câu hỏi đã gần 3 tuổi và nó đã được trả lời
Galder Zamarreño

Câu trả lời:


33

Sao chép từ Emacs vào bảng tạm OS X:

chọn vùng rồi M-| pbcopy RET

Dán từ bảng tạm OS X vào Emacs:

C-u M-| pbpaste RET (thay thế khu vực hiện tại nếu nó tồn tại)


Giải trình:

M-|chạy shell-command-on-region, như tên gọi ngụ ý đường ống khu vực hiện tại đến một lệnh shell. C-u M-|thực hiện điều tương tự, nhưng thay thế vùng hiện tại bằng stdoutlệnh đang được chạy.

pbcopypbpastelà các tiện ích OS X để truy cập vào bảng tạm hệ thống.


1
Bên cạnh việc trả lời câu hỏi, câu trả lời của bạn đã dạy tôi cách chạy các lệnh shell từ emacs, Amazing.
andreskwan

20

Sau đây chỉ hoạt động, được sao chép từ đây

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

Verbiage ở đây dường như ngược
Jordon Biondo

1
Với chế độ tà ác, điều này phá vỡ hành vi dán bẩn thỉu
Felix D.

@FelixD.: Có xclip-modebị vấn đề tương tự không?
Stefan

Điều này dường như bị phá vỡ trong Emacs26 khi sao chép và dán các ký tự đa nhân, như được mô tả trong emacs.stackexchange.com/questions/50485/ phỏng
quietj

9

Nếu bạn sử dụng Emacs "theo cách thông thường" (nghĩa là một ứng dụng GUI), thì nó sẽ làm điều đó theo mặc định. Nếu bạn sử dụng Emacs bên trong trình giả lập thiết bị đầu cuối, thì thực sự nó không biết cách làm điều đó theo mặc định, nhưng bạn có thể cài đặt xclipgói từ GNU ELPA và sau đó kích hoạt cách xclip-modedạy Emacs cách làm điều đó cho cả GNU / Linux và cho OSX.


xcliphoạt động với OSX không? Từ những gì tôi thấy ngoài kia, nó dường như được thiết kế để hoạt động với X11, xem bài đăng
Galder Zamarreño

1
các xclip.elgói đã được mở rộng sử dụng pbpaste.
Stefan

thiết bị đầu cuối emacs trong chế độ máy chủ (không phải như thông thường) đóng băng khi tôi sử dụng xclip trong macOS vì một số lý do.
rien333

Bạn có thể báo cáo đó là một lỗi không (trực tiếp với tôi hoặc thông qua M-x report-emacs-bug?
Stefan

3

Như Stefan đã nói, các ứng dụng Emacs đồ họa nên làm điều đó theo mặc định.

Trong một thiết bị đầu cuối văn bản, một tùy chọn khác là sử dụng các chức năng như thế này:

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

ngoại trừ khi nó không. 20 năm sau, cùng một pb trong emacs .... Tôi thực sự ước có một nền tảng chung và lành mạnh, được đặt trong đá ở đâu đó
nicolas

1

Đây là một chức năng elisp đơn giản mà bạn có thể đặt trong tệp .emacs sao chép nội dung của bộ đệm bạn đang vào bảng tạm. Bạn không phải chọn bất cứ điều gì, nó sao chép tất cả. Mã này ngắn và khá tự giải thích.

(defun xclip ()
(interactive)
(shell-command (concat "cat " (buffer-file-name (window-buffer (minibuffer-selected-window))) " | pbcopy")))

Sau khi bạn tải hoặc tải lại emacs, hãy gọi nó bằng Mx xclip.
jumar

OP đã không yêu cầu sao chép toàn bộ bộ đệm vào bảng tạm, vì vậy điều này không làm những gì được yêu cầu. Đối với phần còn lại, điều này dường như chỉ lặp lại những gì người khác đã nói.
Stefan

Tôi xin lỗi nếu điều này có vẻ lạc đề. Tôi đã điều hướng đến trang này từ Google, nơi đây là kết quả đầu tiên cho "sao chép văn bản vào clipboard emacs". Câu hỏi có tiêu đề "Sao chép văn bản từ Emacs vào bảng tạm OS X", vì vậy thật dễ dàng để biết cách bạn có thể kết thúc ở đây cho kết quả tìm kiếm đó. Tôi nghĩ rằng nó có thể áp dụng cho cách đặt câu hỏi của họ, một câu hỏi thay thế. Tôi đã truy cập các câu trả lời của StackExchange trước đây và đã thất vọng khi một câu trả lời đơn giản không có sẵn, đặc biệt là khi tôi biết hàng ngàn người đang đặt câu hỏi, vì vậy tôi nghĩ rằng tôi sẽ thêm câu hỏi của mình cho những người có thể hưởng lợi.
jumar

0

Kiểm tra clipboard-kill-regionclipboard-yank. Những điều này đến từ menu-bar.el.

Khi một vùng được tô sáng, bạn có thể sử dụng clipboard-kill-area để hủy vùng đó cho cả bộ đệm dán và bảng tạm hệ thống. clipboard-yank "dán" bất cứ thứ gì hiện có trên clipboard hệ thống.


Hãy mở rộng câu trả lời của bạn.
Dan

Tôi đã cố gắng sao chép một cái gì đó từ emacs bằng các lệnh đó và không có sẵn bên ngoài để sao chép nó ở một nơi khác bên ngoài Emacs.
Galder Zamarreño

@ GalderZamarreño nó hoạt động với tôi trong Emacs và tôi đang dùng OSX.
bitops

0

Câu trả lời của Galder Zamarre là tuyệt vời, tuy nhiên, nó phá vỡ puthành vi giống như ác quỷ trong chế độ tà ác. Do đó, tôi đã điều chỉnh nó một chút dưới mức tôi chắc chắn rằng nó có thể tốt hơn, nhưng nó làm được việc cho tôi. Hãy đề nghị cải tiến:

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

----> Mã mới

  (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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.