将文本从Emacs复制到OS X剪贴板


25

当我在文本终端而不是普通的GUI模式下运行Emacs时,可以通过使用激活区域的开头在Emacs中进行复制C-SPC,然后选择所需的内容,然后执行操作M-w

是否有任何方法可以通过OSX剪贴板中的粘贴方式复制粘贴到网页中的区域(显然不是通过在其GUI模式下运行Emacs)?

我对创建其他快捷方式并不感兴趣,理想情况下,它不需要安装任何模块。

我看过这篇文章并尝试了接受的答案,但是它似乎无法按照我上面期望的方式工作。

还有其他想法吗?


老兄,这个问题几乎是3岁,并已回答
盖尔德Zamarreño

Answers:


33

从Emacs 复制到OS X剪贴板:

然后选择地区 M-| pbcopy RET

粘贴从OS X剪贴板Emacs的:

C-u M-| pbpaste RET (如果存在则替换当前区域)


说明:

M-|运行shell-command-on-region,顾名思义,它将当前区域通过管道传递给Shell命令。C-u M-|做同样的事情,但是用stdout正在运行的命令替换当前区域。

pbcopy并且pbpaste是OS X实用程序访问系统剪贴板。


1
除了回答问题,您的答案还教会了我如何从emacs运行Amazing的shell命令。
andreskwan

20

以下是可行的,从这里复制

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

这里的语言似乎倒退了
Jordon Biondo

1
在邪恶模式下,这打破了温和的粘贴行为
Felix D.

@FelixD .:是否xclip-mode遇到相同的问题?
Stefan

这似乎在Emacs26复制和粘贴多字节字符时坏,如在emacs.stackexchange.com/questions/50485/...
silencej

9

如果您以“常规方式”使用Emacs(即作为GUI应用程序),则默认情况下它应该已经这样做。如果您在终端仿真器中使用Emacs,则默认情况下它确实不知道如何执行此操作,但是您可以xclip从GNU ELPA 安装该软件包,然后启用,该功能xclip-mode可以教Emacs如何针对GNU / Linux和Linux OSX。


是否xclip有OSX的工作?从我所看到的地方来看,它似乎旨在与X11配合使用,请参见发布
GalderZamarreño2015年

1
xclip.el软件包已扩展使用pbpaste
Stefan 2015年

当我出于某些原因在macOS下使用xclip时,服务器模式下的终端emacs(不是常规实例)冻结。
rien333 '18

您能否将其报告为错误(直接向我报告还是通过错误报告M-x report-emacs-bug
Stefan

3

正如Stefan所说,图形化Emacs应用程序默认情况下应该这样做。

在文本终端中,另一种选择是使用如下功能:

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

除非没有。20年后,emacs中的铅含量相同。...我真的希望有一块普通而健全的地面,被石头固定在某个地方
nicolas

1

这是一个简单的elisp函数,您可以将其放入.emacs文件,该文件将您所在缓冲区的内容复制到剪贴板。您无需选择任何内容,它会复制所有内容。该代码简短,不言自明。

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

加载或重新加载emacs之后,请使用Mx xclip对其进行调用。
Jumar的

OP并没有要求将整个缓冲区复制到剪贴板,因此不会执行所要求的操作。至于其余的,这似乎只是在重复别人已经说过的话。
Stefan

如果这似乎不对,我深表歉意。我从Google导航到此页面,这是“将文本复制到剪贴板emacs”的第一个结果。该问题的标题为“将文本从Emacs复制到OS X剪贴板”,因此很容易看到如何最终找到该搜索结果。我确实认为这适用于他们问题的短语,它的超集。我之前访问过StackExchange的答案,当没有简单的答案时就感到沮丧,尤其是当我知道成千上万的人在问这个问题时,我因此感到沮丧。
Jumar的

0

签出clipboard-kill-regionclipboard-yank。这些来自menu-bar.el

突出显示区域后,您可以使用剪贴板-kill-区域将区域杀死到粘贴缓冲区和系统剪贴板中。Clipboard-yank“粘贴”当前系统剪贴板上的任何内容。


请扩大您的答案。

我尝试使用这些命令从emacs复制某些内容,但无法从外部将其复制到Emacs之外的其他地方。
GalderZamarreño2015年

@GalderZamarreño它在Emacs中对我有效,并且在OSX上。
bitops 2015年

0

GalderZamarreño的答案很好,但是它打破了put以邪恶模式出现的类似邪恶的行为。因此,我在下面对其进行了一些调整-我相信它可能会更好,但是它可以为我完成工作。随时提出改进建议:

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

---->新代码

  (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))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.