Cách sao chép văn bản từ Emacs sang một ứng dụng khác trên Linux


113

Khi tôi cắt (giết) văn bản trong Emacs 22.1.1 (trong cửa sổ riêng của nó trên X, trong KDE, trên Kubuntu), tôi không thể dán (kéo) nó vào bất kỳ ứng dụng nào khác.


Tôi đề nghị bạn đọc cái này: CopyAndPaste-Emacs Wiki . Điều này giải thích rất tốt vấn đề tour du lịch.
El borito

Câu trả lời:


122

Hãy cẩn thận với các định nghĩa của chúng tôi ở đây

  • Một Emacs bản sao là lệnh kill-ring-save(thường là bị ràng buộc vào M-w).
  • Bản sao hệ thống là những gì bạn thường nhận được khi nhấn C-c(hoặc chọn "Chỉnh sửa-> Sao chép" trong cửa sổ ứng dụng).
  • Một bản sao X được "chất" làm nổi bật văn bản với con trỏ chuột.
  • Một Emacs dán là lệnh yank(thường là bị ràng buộc vào C-y).
  • Một dán hệ thống là những gì bạn thường nhận được từ bức xúc C-v(hoặc chọn "Edit-Paste" trong một cửa sổ ứng dụng).
  • Một dán X là nhấn vào nút "trung tâm chuột" (mô phỏng bằng cách nhấn các nút chuột trái và phải cùng nhau).

Trong trường hợp của tôi (trên GNOME):

  • Cả Emac và bản sao hệ thống thường hoạt động với X paste.
  • Bản sao X thường hoạt động với dán Emacs.
  • Để làm cho bản sao hệ thống hoạt động với dán Emacs và bản sao Emacs hoạt động với dán hệ thống, bạn cần thêm (setq x-select-enable-clipboard t)vào của mình .emacs. Hay là thử

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

Tôi nghĩ đây là hành vi Unix hiện đại khá chuẩn.

Điều quan trọng cần lưu ý (mặc dù bạn nói rằng bạn đang sử dụng Emacs trong một cửa sổ riêng biệt) rằng khi Emacs đang chạy trong bảng điều khiển, nó hoàn toàn tách biệt với hệ thống và khay nhớ tạm X: cắt và dán trong trường hợp đó được trung gian bởi thiết bị đầu cuối . Ví dụ: "Chỉnh sửa-> Dán" trong cửa sổ đầu cuối của bạn sẽ hoạt động chính xác như thể bạn nhập văn bản từ khay nhớ tạm vào bộ đệm Emacs.


7
Đây là thuật ngữ khó hiểu . Tên chuẩn và ít gây nhầm lẫn hơn cho cái bạn gọi là “X copy / paste” là lựa chọn chính X. Cái bạn gọi là “sao chép / dán hệ thống” là khay nhớ tạm X.
Gilles 'SO- đừng xấu xa nữa'.

Cảm ơn ... có vẻ như biến đã được đổi tên kể từ khi nó được viết. META-X set-variable RET select-enable-clipboard RET thoặc(setq select-enable-clipboard t)
David McCorrie

95

Chèn phần sau vào .emacstệp của bạn :

(setq x-select-enable-clipboard t)

3
Không dài dòng, cho bạn biết những gì bạn cần biết. Câu trả lời xuất sắc.
JasonFruit

Hoạt động hoàn hảo, tôi sử dụng Ubuntu 12.04. Cảm ơn
zhihong

7
Đẹp và đơn giản, nhưng điều này không hoạt động trong thiết bị đầu cuối. Không có lý do gì tại sao cùng một phím tắt không hoạt động cả trong terminal và cửa sổ miễn phí, và một số câu trả lời bên dưới giải quyết đồng thời cả hai.
RussellStewart

1
Khi tôi chạy emacs -nw, tôi sử dụng các phím tắt riêng của thiết bị đầu cuối; Shift-Ctrl-X để cắt (hủy) văn bản và Shift-Ctrl-C để sao chép.
memius

4
Điều đó sẽ không hoạt động khi bạn chạy emacs -nwbên trong các cửa sổ tmux được chia theo chiều ngang.
Sridhar Ratnakumar

11

Tôi gắn cái này vào .emac của mình:

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

Sau đó, tôi về cơ bản không gặp vấn đề gì khi cắt và dán qua lại từ bất kỳ thứ gì trong Emacs sang bất kỳ ứng dụng X11 hoặc Gnome nào khác.

Phần thưởng: để những điều này xảy ra trong Emacs mà không cần phải tải lại toàn bộ .emac của bạn, hãy thực hiện Cx Ce bằng con trỏ ngay sau dấu ngoặc đóng của từng biểu thức đó trong bộ đệm .emacs.

Chúc may mắn!


3
Giải pháp này làm việc cho emacs trong một cửa sổ X tức là emacs đang chạy bên trong một cửa sổ nếu bạn đang chạy emacs trong dòng lệnh những gì bạn cần là: stackoverflow.com/questions/5288213/...
elviejo79

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

10

Khó khăn với việc sao chép và dán trong Emacs là bạn muốn nó hoạt động độc lập với kill / yank nội bộ và bạn muốn nó hoạt động cả trong terminal và gui. Hiện có các giải pháp mạnh mẽ cho thiết bị đầu cuối hoặc gui, nhưng không phải cả hai. Sau khi cài đặt xsel (ví dụ sudo apt-get install xsel), đây là những gì tôi làm để sao chép và dán để kết hợp chúng:

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

Đối với tôi đang nhận được lỗi vì không có thông số. Tôi cần phải thay đổi dòng đầu tiên "(defun copy-to-clipboard ()" thành "(defun sao chép từ-ubuntu (văn bản & push tùy chọn)" công trình này cho tôi: D.
Renato Cassino

Nó hoạt động nhưng thao tác dán khá chậm, nó có thể được nhận ra vào mạng không?
alper

7

Tôi giả sử bằng emacs bạn đang có nghĩa là Emacs dưới X (nghĩa là không bên trong cửa sổ đầu cuối).

Có hai cách:

  1. (Chỉ áp dụng cho hệ điều hành unix) Đánh dấu văn bản mong muốn bằng chuột của bạn (thao tác này sao chép văn bản đó vào khay nhớ tạm X) và sau đó nhấp chuột giữa để dán.
  2. Đánh dấu văn bản mong muốn và sau đó chọn "Mx clipboard-kill-ring-save" (lưu ý rằng bạn có thể liên kết văn bản này với một phím dễ dàng hơn). Sau đó, chỉ cần "Chỉnh sửa-> Dán" trong ứng dụng yêu thích của bạn.

Hoạt động bảng tạm có sẵn:

  • clipboard-kill-ring-save - sao chép lựa chọn từ Emacs vào khay nhớ tạm
  • clipboard-kill-region - cắt lựa chọn từ Emacs vào khay nhớ tạm
  • clipboard-yank - dán từ khay nhớ tạm vào Emacs

7

một bài báo EmacsWiki giải thích một số vấn đề với sao chép & dán dưới X và cách định cấu hình nó hoạt động.


Có một mục wiki emacs để sao chép và dán. Đó là cách tồi tệ.
nicolas

4

Điều này hoạt động với M-wtrên Mac OSX. Chỉ cần thêm vào tệp .emacs của bạ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))))

(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)

Nguồn https://gist.github.com/the-kenny/267162


1

Đoạn mã dưới đây, lấy cảm hứng từ câu trả lời của @ RussellStewart ở trên, bổ sung hỗ trợ cho x-PRIMARY và x-SECONDARY, thay thế region-active-pbằng use-region-pđể bao gồm trường hợp vùng trống, không trả về im lặng nếu xsel chưa được cài đặt (trả về thông báo lỗi), và bao gồm một chức năng "cắt" (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)

Có bất kỳ lý do nào để không ghi đè các keybindings tiêu chuẩn không?
Paul Brodersen

@Paul: 'keybindings tiêu chuẩn' dành cho 'emacs internal clipboard', khác với X-clipboard. Tôi đã trích dẫn thuật ngữ 'emacs Internal clipboard' vì thuật ngữ emacs khác nhau - hãy tham khảo lời giải thích tuyệt vời của Chris Conway ở trên.
user1404316

1

Tôi sử dụng phần sau, dựa trên các câu trả lời khác ở đây, để tạo C-x C-wC-x C-ysao chép và dán trên cả Mac và Linux (nếu ai đó biết phiên bản dành cho Windows, vui lòng thêm nó). Lưu ý rằng trên Linux, bạn sẽ phải cài đặt xsel và xclip bằng trình quản lý gói của mình.

;; 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
Trên thực tế, bạn cũng có thể sử dụng xclipđể dán nội dung khay nhớ tạm bằng cách sử dụng xclip -o. Điều này có thể hữu ích cho những người đã có xclipvà không muốn cài đặt một chương trình khác để thực hiện cả việc sao chép và dán.
Amin NAIRI

0

Rất tiếc, bạn đang sử dụng nền tảng nào và phiên bản emacs nào? Với GNU Emacs 22.1.1 trên Windows Vista, nó hoạt động tốt đối với tôi.

Nếu, nếu bạn đang thực hiện việc này từ windows sang linux thông qua trình xem RealVNC, hãy đảm bảo rằng bạn đang chạy "vncconfig -iconic" trên hộp linux trước .....


0

Tôi luôn sử dụng thao tác dán nhanh - kéo lựa chọn trong emacs, nhấn nút chuột giữa trong cửa sổ mục tiêu.

(Từ tham chiếu đến kate, tôi cho rằng bạn đang sử dụng linux hoặc tương tự và có thể đang sử dụng emacs trong X theo cách này hay cách khác.)


0

Bạn có thể muốn chỉ định nền tảng bạn đang sử dụng. Nó có trên linux, unix, macosx, windows, ms-dos không?

Tôi tin rằng đối với các cửa sổ, nó sẽ hoạt động. Đối với MacOSX, nó sẽ được thêm vào khay nhớ tạm của x-windows, không giống như khay nhớ tạm của macosx. Đối với Linux, nó phụ thuộc vào hương vị của trình quản lý cửa sổ của bạn, nhưng tôi tin rằng x-windows xử lý nó theo cách tốt trên hầu hết chúng.

Vì vậy, hãy chỉ rõ.


-1

Những gì tôi làm là sử dụng một công cụ đầu cuối tốt (PuTTY trên Windows, Konsole hoặc Terminal trên Linux) có tích hợp các tiện ích sao chép.

Trong PuTTY, bạn đánh dấu văn bản bạn muốn bằng chuột và sau đó dán nó vào nơi khác. Nhấp chuột phải vào cửa sổ PuTTY sẽ dán nội dung của bộ đệm sao chép / dán Windows.

Trong Konsole hoặc Terminal trên Linux, bạn đánh dấu những gì bạn muốn sau đó nhấn Shift + Ctrl + C để sao chép và Shift + Ctrl + V để dán.

Trong phần biên dịch emac của win32, phần lớn thời gian kéo văn bản sẽ đưa nó vào bộ đệm sao chép / dán.

Trên Mac OS X, các phím tắt Apple-key hoạt động tốt, vì Terminal bẫy chúng.

Không có cách nào thực hiện trực tiếp trên dòng lệnh bởi vì shell không duy trì một bộ đệm sao chép / dán cho mỗi ứng dụng. bash không duy trì một bộ đệm sao chép / dán cho chính nó và theo mặc định, các phím tắt emacs ^ k / ^ y hoạt động.

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.