Câu trả lời:
Hãy cẩn thận với các định nghĩa của chúng tôi ở đây
kill-ring-save
(thường là bị ràng buộc vào M-w).yank
(thường là bị ràng buộc vào C-y).Trong trường hợp của tôi (trên GNOME):
Để 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.
META-X set-variable RET select-enable-clipboard RET t
hoặc(setq select-enable-clipboard t)
Chèn phần sau vào .emacs
tệp của bạn :
(setq x-select-enable-clipboard t)
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.
emacs -nw
bên trong các cửa sổ tmux được chia theo chiều ngang.
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!
Symbol’s function definition is void: x-cut-buffer-or-selection-value
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)
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:
Hoạt động bảng tạm có sẵn:
Có 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.
Điều này hoạt động với M-w
trê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)
Đ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-p
bằ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)
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-w
và C-x C-y
sao 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)))
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ó xclip
và 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.
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 .....
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õ.
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.