Answers:
让我们小心这里的定义
kill-ring-save
(通常结合于M-w)。yank
(通常结合于C-y)。就我而言(在GNOME上):
要使系统复制与Emacs粘贴一起工作,并且使Emacs复制与系统粘贴一起工作,您需要添加(setq x-select-enable-clipboard t)
到中.emacs
。或尝试
META-X set-variable RET x-select-enable-clipboard RET t
我认为这是相当标准的现代Unix行为。
同样重要的是要注意(尽管您说您在单独的窗口中使用Emacs),当Emacs在控制台中运行时,它与系统和X剪贴板完全分离:在这种情况下,剪切和粘贴是由终端介导的。例如,终端窗口中的“编辑->粘贴”应完全像将剪贴板中的文本输入到Emacs缓冲区中一样。
META-X set-variable RET select-enable-clipboard RET t
要么(setq select-enable-clipboard t)
将以下内容插入.emacs
文件:
(setq x-select-enable-clipboard t)
emacs -nw
,我使用终端自身的快捷方式。Shift-Ctrl-X剪切(杀死)文本,而Shift-Ctrl-C进行复制。
emacs -nw
在水平拆分的tmux窗口中运行时,此操作将无效。
我将其粘贴在.emacs中:
(setq x-select-enable-clipboard t)
(setq interprogram-paste-function 'x-cut-buffer-or-selection-value)
随后,我基本上没有问题,可以从Emacs中的任何内容剪切和来回粘贴到任何其他X11或Gnome应用程序。
奖励:要使这些事情在Emacs中发生而不必重新加载整个.emacs,请在.emacs缓冲区中每个表达式的关闭括号后紧接着用光标执行Cx Ce。
祝好运!
Symbol’s function definition is void: x-cut-buffer-or-selection-value
在Emacs中复制和粘贴的困难在于,您希望它独立于内部kill / yank运行,并且希望它同时在终端和gui中运行。现有针对终端或GUI的强大解决方案,但不能同时针对两者。安装xsel(例如sudo apt-get install xsel
)后,这是我要做的复制和粘贴操作以将它们组合在一起:
(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)
这适用于M-w
Mac OSX上。只需添加到您的.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)
下面的代码,通过@ RussellStewart的回答上面的启发,增加了对支持X-PRIMARY和X中学,更换region-active-p
与use-region-p
覆盖的空白区域的情况下,如果XSEL尚未安装(返回的错误信息)不不返回,并包含“剪切”功能(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-x C-w
和C-x C-y
被复制和在Mac和Linux上粘贴(如果有人知道的版本的Windows随意添加它)。请注意,在Linux上,您将必须使用软件包管理器安装xsel和xclip。
;; 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
来粘贴剪贴板内容xclip -o
。这对于已经拥有xclip
并不想安装其他程序来执行复制和粘贴操作的人很有用。
您可能要指定使用的平台。是在Linux,Unix,MacOSX,Windows,MS-DOS上吗?
我相信对于Windows,它应该可以工作。对于MacOSX,它将添加到x-windows剪贴板中,这与macosx剪贴板不同。对于Linux,这取决于您的窗口管理器风格,但是我相信x-windows在大多数窗口中都可以很好地处理它。
因此,请指定。
我要做的是使用内置复制功能的优质终端工具(在Windows上为PuTTY,在Linux上为Konsole或Terminal)。
在PuTTY中,用鼠标突出显示所需的文本,然后将其粘贴到其他位置。在PuTTY窗口中单击鼠标右键将粘贴Windows复制/粘贴缓冲区的内容。
在Linux上的Konsole或Terminal中,突出显示所需内容,然后按Shift + Ctrl + C进行复制,并按Shift + Ctrl + V进行粘贴。
在emacs的win32编译中,大多数情况下,拖拽文本确实会将其放置在复制/粘贴缓冲区中。
在Mac OS X上,Apple键快捷键可以正常工作,因为Terminal会捕获它们。
在命令行上没有直接的方法,因为Shell不会为每个应用程序维护复制/粘贴缓冲区。bash 确实会为其自身保留一个复制/粘贴缓冲区,并且默认情况下,emacs ^ k / ^ y快捷方式有效。